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]'
哈希处理。