将.NET与nodejs进行比较时,散列值不同(加密)

时间:2016-06-30 19:28:32

标签: c# node.js hash

当我尝试在节点和.NET中散列相同的密码/ salt组合时,我得到了不同的值。 (是的,我知道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的值不一样。有什么想法会发生什么?

1 个答案:

答案 0 :(得分:-1)

默认Encoding.Unicode正在发出byteOrderMask 如果您在C#代码中创建没有BOM的编码怎么办?

new UnicodeEncoding(false, false)