NodeJS:加密 - 为什么我在输入时得到相同的哈希?

时间:2017-04-07 01:36:08

标签: node.js hash cryptography

我正在使用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

有人可以解释一下原因吗?

1 个答案:

答案 0 :(得分:2)

您只需查看

的结果即可看到
crypto.createHash('sha256').update('abc')+'123'

> '[object Object]123'

当您尝试向哈希对象添加字符串时,您将哈希值转换为字符串,从而产生此常量字符串。

如果您使用

hashPwd = crypto.createHash('sha256').update(salt + hashPwd).digest('hex')

它会正常工作。

所以基本上你只是一遍又一遍地散列字符串salt+'[object Object]'

相关问题