我正在使用 Crypto 对带有盐的字符串进行 200 次哈希处理。我有一个奇怪的行为,哈希值总是相同的。我现在让它返回看起来正确的结果,但我想知道是否有人可以告诉我原因。
这是每次产生相同哈希值的原始代码(假设相同的盐):
const crypto = require('crypto');
console.log(hashPwd('abc', '11111111111111111111111111111111'));
console.log(hashPwd('def', '11111111111111111111111111111111'));
function hashPwd(password, hexSalt){
var salt = hex2a(hexSalt);
var hashPwd = crypto.createHash('sha256').update(salt + password);
for(var x =0; x < 199; x++){
hashPwd = crypto.createHash('sha256').update(salt + hashPwd);
}
return hashPwd.digest('hex');
}
//From: http://stackoverflow.com/questions/3745666/how-to-convert-from-hex-to-ascii-in-javascript
function hex2a(hexx) {
var hex = hexx.toString();//force conversion
var str = '';
for (var i = 0; i < hex.length; i += 2)
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
return str;
}
以上输出结果:
52cfd2b127266c1c846ded37c986d8663506118332437daa6eadbc32525c2aa4
52cfd2b127266c1c846ded37c986d8663506118332437daa6eadbc32525c2aa4
下面的代码返回预期结果:
const crypto = require('crypto');
console.log(hashPwd('abc', '11111111111111111111111111111111'));
console.log(hashPwd('def', '11111111111111111111111111111111'));
function hashPwd(password, hexSalt){
const hasher = crypto.createHash('sha256');
var salt = hex2a(hexSalt);
var hashPwd = hasher.update(salt + password);
for(var x =0; x < 199; x++){
hashPwd = hasher.update(salt + hashPwd);
}
return hashPwd.digest('hex');
}
//From: http://stackoverflow.com/questions/3745666/how-to-convert-from-hex-to-ascii-in-javascript
function hex2a(hexx) {
var hex = hexx.toString();//force conversion
var str = '';
for (var i = 0; i < hex.length; i += 2)
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
return str;
}
产生正确的:
05525f74c0220924a2c9626ca75c2d997bf8b49a8c74208501aaf7a222d11899
c846cb3dc58163530b7b7afc7b467c104fa11566f405b333d030e5e6595bfaec
有人可以解释一下为什么吗?
最佳答案
只要看一下结果就可以看出
crypto.createHash('sha256').update('abc')+'123'
> '[object Object]123'
当您尝试将字符串添加到哈希对象时,您正在将哈希转换为字符串,从而生成此常量字符串。
如果您使用过
hashPwd = crypto.createHash('sha256').update(salt + hashPwd).digest('hex')
它会正常工作。
所以本质上你只是一遍又一遍地散列字符串salt+'[object Object]'
。
关于node.js - NodeJS : Crypto - Why do I get the same hash no matter on the input?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43268301/