2017-09-16 65 views
0

我想從CryptoJS使用PBKDF2和鹽哈希來存儲我的密碼。這是我湊了從登記的用戶密碼的一部分:CryptoJS PBKDF2和鹽哈希方法不起作用

var passwordInput = document.getElementById("txtPasswordInput").value; 
var salt = CryptoJS.lib.WordArray.random(128/8); 
var key512Bits1000Iterations = CryptoJS.PBKDF2(passwordInput, salt, { keySize: 512/32, iterations: 1000 }); 

console.log(salt.toString()); 
console.log(key512Bits1000Iterations.toString()); 

隨着ABCD1234作爲密碼,我設法將這些存儲到我的數據庫:

Salt: cec16a7e68e0f3e49f729dfd90b0893a 
Password: d974b96a494f39aec7f1fa6c495b4783b43e579c070b695... 

在我的登錄頁面,我想再次根據用戶輸入計算哈希以驗證憑證:

var passwordInput = document.getElementById("txtPassword").value; 
// retrieve from firebase 
var password = accountData.password; 
var salt = accountData.salt; 
var key512Bits1000Iterations = CryptoJS.PBKDF2(passwordInput, salt, { keySize: 512/32, iterations: 1000 }); 
console.log(salt.toString()); 
console.log(key512Bits1000Iterations.toString()); 

if(password != key512Bits1000Iterations){ 
console.log('wrong'); 
}else{ 
console.log('correct'); 
} 

但是,它一直在返回我'錯誤'。我打印出散列的密碼,但它們都不同。

此外,在按下寄存器或登錄按鈕後,哈希算法實際需要一段時間才能在我的瀏覽器再次返回響應之前進行計算。該算法是否被設計爲計算緩慢?任何想法如何克服這一點?

任何想法?謝謝!

回答

2

在登錄頁面上,salt需要被解析爲十六進制。

是的,PBKDF2被設計得很慢。您可以以更少的迭代速度加速安全性。

+0

任何解釋鹽爲十六進制的理由?對不起,但我對加密領域有點新鮮。在速度性能和安全性方面,這種情況下迭代的期望和可接受的範圍是什麼? – guest176969

+0

@ guest176969 1.使用十六進制可能是一種處理二進制數據的Javascript方式。 2.合理的速度大約爲100ms的CPU時間。 – zaph

+0

當你將salt保存到數據庫時,你將salt序列化爲一個十六進制字符串,所以現在你需要從一個十六進制字符串中取消它的序列化。 –