NodeJS:Crypto – 无论input什么,我为什么得到相同的散列?

我正在使用encryption哈希一个string与盐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' 

当您尝试将string添加到您的哈希对象时,您正在将哈希强制转换为一个string,这将导致此常量string。

如果你用过

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

它会正常工作。

所以基本上你只是一遍又一遍地对stringsalt+'[object Object]'哈希处理。