2017-04-07 40 views
1

我正在使用加密哈希字符串與鹽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 

有人能解釋爲什麼嗎?

+0

在半相關說明中,如果您控制所有內容,則不應使用純哈希表示密碼。相反,考慮使用類似bcrypt(或可能是scrypt或pbkdf2)。 – mscdex

+0

@mscdex謝謝你的建議。我實際上是從bcrypt開始的,但是我使用的前幾個庫在Windows上並不能很好地運行。對於這個特定的應用程序,200次迭代的sha256確實應該足夠了。我顯然需要解決我的錯誤,所以這是正確的。 – Doug

回答

2

您可以只用看的

crypto.createHash('sha256').update('abc')+'123' 

> '[object Object]123' 

當您嘗試將字符串添加到您的哈希對象的結果看,你是鑄造哈希爲一個字符串,這將導致該字符串常量。

如果您使用

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

這將正常工作。

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

+0

這對於第一個代碼示例失敗的原因非常有用。但是,如果是這樣的話,爲什麼第二個代碼示例給了我看起來好的結果呢?它不應該做同樣的事情嗎? – Doug

+1

第二個更新使用實際的密碼。之後,你只是用無用的字符串更新。但是,第一個散列會使內部狀態不同 –

相關問題