c# - NodeJS:如何生成类似于C#的Rfc2898DeriveBytes?

我正在尝试使用NodeJS加密库和C#Rfc2898DeriveBytes生成相同的密码哈希。使用C#生成的salt时,NodeJs实现不会生成相同的密钥。我究竟做错了什么?
在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")
})


如您所见,C#和Nodejs中的hass pass是不同的。
节点->


  1000:qcMqVYE0EzAU9Uz + mQxBaKFICG1vR1iq:D19SUxg6AQxgSLe7YXISPWPvgIoR6BEw


C#->


  1000:qcMqVYE0EzAU9Uz + mQxBaKFICG1vR1iq:RkdpgAcpijFqYgVxBCvJugMXqnt4j5f3

最佳答案

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

看起来Rfc2898DeriveBytes默认使用SHA1。因此,您应该在节点中使用过类似的方法:

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

本文翻译自 https://stackoverflow.com/questions/50887002/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# node.js


相关文章:

c# - 在自定义面板上绘制线条/边框

c# - ASP.NET MVC-显示项目列表,每个项目都有一个项目列表

c# - C#实体框架+ Linq-如何加快慢速查询的速度?

c# - 无法从通用类型转换为接口

c# - 如何使用SaveFileDialog的过滤器

c# - 如何在XAML中多次对元素的宽度进行动画处理?

c# - 如何从Visual Studio解决方案/项目中读取文件?

c# - 结构图Web Api 2帐户控制器和个人帐户

c# - C#:通过检测空格来解析字符串中的子字符串

c# - [Flags]枚举属性在C#中意味着什么?