将.NET与nodejs(crypto)进行比较时,哈希值不同

当我尝试在节点和.NET中散列相同的密码/盐组合时,我得到了不同的值。 (是的,我知道SHA1是危险的,我也试图改变这一点)。

C#

byte[] unencodedBytes = Encoding.Unicode.GetBytes(password); byte[] saltBytes = Convert.FromBase64String(salt); byte[] buffer = new byte[unencodedBytes.Length + saltBytes.Length]; Buffer.BlockCopy(unencodedBytes, 0, buffer, 0, unencodedBytes.Length); Buffer.BlockCopy(saltBytes, 0, buffer, unencodedBytes.Length - 1, saltBytes.Length); byte[] hash = HashAlgorithm.Create("SHA1").ComputeHash(buffer); //This is what I need string hashedString = Convert.ToBase64String(hash); 

这是我的JS

 var buffer = []; var unicodePassword = new Buffer(password, 'utf16le'); for (var i = 0; i < unicodePassword.length; ++i) { buffer.push(unicodePassword[i]); } var salt = new Buffer(userEntry.PasswordSalt, 'base64'); for (var i = 0; i < salt.length; i++) { buffer.push(salt[i]); } var bufferString = new Buffer(buffer); //This is what I need var hashedString = crypto.createHash('sha1').update(bufferString).digest('base64'); 

我知道,当我发送散列时,我在两个实现中都得到完全相同的字节数组。 它看起来像这个代码是做同样的事情,但hashedString的值是不一样的。 任何想法是怎么回事?

默认的Encoding.Unicode是发出byteOrderMask如果你在C#代码中创build没有BOM的编码,该怎么办?

new UnicodeEncoding(false, false)