当我尝试在节点和.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
的值不一样。有什么想法会发生什么?
答案 0 :(得分:-1)
默认Encoding.Unicode
正在发出byteOrderMask
如果您在C#代码中创建没有BOM的编码怎么办?
new UnicodeEncoding(false, false)