c# - Node : How to generate Rfc2898DeriveBytes like C#?

标签 c# node.js

我正在尝试使用 NodeJS 加密库和 C# Rfc2898DeriveBytes 生成相同的密码哈希。使用从 C# 生成的盐时,NodeJs 实现不会生成相同的 key 。我究竟做错了什么? 在 C# 中:

public static string HashPassword(string password)
    {
        // random khóa 
        using (var rngCryp = new RNGCryptoServiceProvider())
        {
            var salt = new byte[SaltBytes];
            rngCryp.GetBytes(salt);

            // Hash the password and encode the parameters
            byte[] hash = Rfc2898Deriver(password, salt, Pbkdf2Iterations, HashBytes);

            return Pbkdf2Iterations + ":" + Convert.ToBase64String(salt) + ":" + Convert.ToBase64String(hash);
        }
    }
private static byte[] Rfc2898Deriver(string password, byte[] salt, int iterations, int outputMaxByte)
    {
        using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
        {
            deriveBytes.IterationCount = iterations;
            return deriveBytes.GetBytes(outputMaxByte);
        }
    }

在 NodeJs 中:

export const hash = (text, salt) => new Promise((resolve, reject) => {
  crypto.pbkdf2(text, salt, iterations, bytes, 'sha256', function (err, derivedKey) {
if (err) { reject(err) }
else {
  //return Pbkdf2Iterations + ":" + Convert.ToBase64String(salt) + ":" + Convert.ToBase64String(hash);
  var hash = new Buffer(derivedKey).toString('base64');
  var pass = `${iterations}:${salt}:${hash}`
  resolve(pass);
}});})

然后这样使用:

var a = Buffer.from("qcMqVYE0EzAU9Uz+mQxBaKFICG1vR1iq", 'base64')
var a0 = new Buffer("qcMqVYE0EzAU9Uz+mQxBaKFICG1vR1iq")
var pas1 = new Buffer('AL7h8Jx4r8a8PjS5', 'base64')
hash(pas1,a0).then(pass => {
    console.log("pass: ", pass)
    const hashes = crypto.getHashes();
    console.log(hashes); // ['DSA', 'DSA-SHA', 'DSA-SHA1', ...]
    res.send(pass + "\n1000:qcMqVYE0EzAU9Uz+mQxBaKFICG1vR1iq:RkdpgAcpijFqYgVxBCvJugMXqnt4j5f3")
})

如你所见,hass pass在C#和Nodejs中是不同的。 Node ->

1000:qcMqVYE0EzAU9Uz+mQxBaKFICG1vR1iq:D19SUxg6AQxgSLe7YXISPWPvgIoR6BEw

C# ->

1000:qcMqVYE0EzAU9Uz+mQxBaKFICG1vR1iq:RkdpgAcpijFqYgVxBCvJugMXqnt4j5f3

最佳答案

我有一个非常相似的问题,实际上你的发现对我帮助很大。 看起来您遇到的唯一问题是传递给 pbkdf2 函数的哈希算法错误。

看起来 Rfc2898DeriveBytes 默认使用 SHA1。所以你应该像在 Node 中那样使用 smth:

crypto.pbkdf2(text, salt, iterations, bytes, 'sha1', (err, key) => {
    console.log(key.toString('hex'));
});

关于c# - Node : How to generate Rfc2898DeriveBytes like C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50887002/

相关文章:

node.js - 如何在nodejs中等待异步函数完成执行

c# - Windows 8 future 访问列表中的内容持续多长时间

c# - 在 .net 中的点阵打印机上打印

c# - 具有 2 个参数和多个结果输出的 lambda 表达式

node.js - Protractor 偶尔无法使用 EADDRINUSE 127.0.0.1 :4444 error 执行测试

javascript - 如何在自己的函数中定义回调函数? Node JS

c# - C#中的委托(delegate)和继承

c# - 创建后无法立即写入文件

node.js - 更新 Node 和 NPM

mysql - 使用 sequelize 从 child 那里获取父记录