我們使用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/
不知道它是否會解決您的問題,但不能將此代碼簡化爲'var password = CryptoJS.SHA3($ prehash);'?根據文檔''當您在字符串上下文中使用WordArray對象時,它會自動轉換爲十六進制字符串「'。所以,如果你只想把散列作爲一個十六進制,那麼真的不需要將它明確地轉換爲一個字符串。 –
@PatrickQ多數民衆贊成在最初,我們這樣做只是爲了揭開面紗,並確保我們知道到底發生了什麼,仍然如此困惑,爲什麼會發生這種情況。 – DrS
[看到這個jsfiddle](http://jsfiddle.net/4wGM2/1/)我得到每次都記錄相同的散列。 –