我正在使用加密哈希字符串與鹽200次。我有一個奇怪的行爲,散列總是相同的。我現在已經返回看起來是正確的結果,但我想知道是否有人可以告訴我爲什麼。NodeJS:加密 - 無論輸入什麼,我爲什麼得到相同的散列?
這是每一個時間(假定相同的鹽),得到相同的哈希的原代碼:
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
有人能解釋爲什麼嗎?
在半相關說明中,如果您控制所有內容,則不應使用純哈希表示密碼。相反,考慮使用類似bcrypt(或可能是scrypt或pbkdf2)。 – mscdex
@mscdex謝謝你的建議。我實際上是從bcrypt開始的,但是我使用的前幾個庫在Windows上並不能很好地運行。對於這個特定的應用程序,200次迭代的sha256確實應該足夠了。我顯然需要解決我的錯誤,所以這是正確的。 – Doug