2014-03-19 185 views
5

我們使用Crypto JS SHA3將我們的用戶名和密碼一起散列。Crypto JS SHA3在同一輸入上給出不同的輸出

該函數從兩個html輸入字段中輸入用戶名和密碼的輸入,並將它們與salt連接起來,並將它們散列。第一個哈希函數成功運行,但是再次哈希相同的輸出會產生不同的結果。

這是相關代碼:

$prehash = $salt + $user + $pass; 

$prehash = CryptoJS.enc.Utf8.parse($prehash); 
var sha3 = CryptoJS.algo.SHA3.create(); 
sha3.update($prehash); 
var password = sha3.finalize().toString(CryptoJS.enc.Hex); 
sha3.reset(); 

var sha3 = CryptoJS.algo.SHA3.create(); 
sha3.update($prehash); 
var password2 = sha3.finalize().toString(CryptoJS.enc.Hex); 
sha3.reset(); 

console.log('PREHASH: ' + $prehash); 

console.log('HASHWORD: ' + password); 

console.log('HASHWORD2: ' + password2); 

控制檯日誌輸出如下:

PREHASH: 4d616e636865737465722c20436f6e6e65637469637574204d6f62696c65205573657273546f776e20436c65726b68617665206272616e6368657320616476616e63652042656c6769756d 

HASHWORD: db90cbb6766f3ca0dc8af39455cd6e224263db31caed3f73f9ad923a02c34211c85cc17a8e3d0166cd82c10d12a137332891c0c201174e16d19a93b6b4d430cf 

HASHWORD2: 
9ed635963fa0079a0520d8afa59d1e19be601d7bf77f623702304240993ce9bdd2f3023ca6bbd44f2ab30ceb2de1c8f0d3fe3d63292c5a23c44ddd1d485baa71 

編輯:我們在其他兩個設備進行測試,並且已經發現,我們得到正確的輸出在另外兩個設備上。這種行爲只能在我的同事手機上觀察到。現在我們更困惑了。有人看到爲什麼不同的設備會產生不同的輸出嗎?

編輯:這是一個jsfiddle,演示了這個問題。它應該是正確的&。在我們的Android 4.2.2設備讀取錯誤&假http://jsfiddle.net/odL57wfo/2/

+0

不知道它是否會解決您的問題,但不能將此代碼簡化爲'var password = CryptoJS.SHA3($ prehash);'?根據文檔''當您在字符串上下文中使用WordArray對象時,它會自動轉換爲十六進制字符串「'。所以,如果你只想把散列作爲一個十六進制,那麼真的不需要將它明確地轉換爲一個字符串。 –

+0

@PatrickQ多數民衆贊成在最初,我們這樣做只是爲了揭開面紗,並確保我們知道到底發生了什麼,仍然如此困惑,爲什麼會發生這種情況。 – DrS

+0

[看到這個jsfiddle](http://jsfiddle.net/4wGM2/1/)我得到每次都記錄相同的散列。 –

回答

0

我們無法找到一個解決這個問題,讓我們開上了加密的js項目中的錯誤,並在平均時間,我們使用的是不同的散列算法

+0

僅供參考:https://code.google.com/p/crypto-js/issues/detail?id = 151 – approxiblue