2012-12-22 61 views
3

我使用的NodeJS的捆綁在一起,SHA256散列在服務器端crypto模塊加密JS不同的輸出。 在客戶端,我使用了一個名爲Crypto-JS的JavaScript庫。的NodeJS「加密」哈希似乎產生比JavaScript庫

我使用SHA256散列對於使用傳統的基於現時的身份驗證登錄系統。然而,我的服務器端和客戶端散列摘要不匹配,即使散列消息是相同的(我已經檢查過)。即使是散列摘要的長度也是不同的。

這是我的客戶端實現的一個片段:

var password_hash = CryptoJS.SHA256(token.nonce /*this is the server's nonce*/ + cnonce + password).toString(CryptoJS.enc.Base64); 

這是我的服務器端執行的一個片段:

var sha256 = CRYPTO.createHash("sha256"); 
sha256.update(snonce+cnonce+password, "utf-8"); 
var hash = sha256.digest("base64"); 

這是一些示例數據:

client-digest: d30ab96e65d09543d7b97d7cad6b6cf65f852f5dd62c256595a7540c3597eec4 
server-digest: vZaCi0mCDufqFUwVO40CtKIW7GS4h+XUhTUWxVhu0HQ= 

client-message: O1xxQAi2Y7RVHCgXoX8+AmWlftjSfsrA/yFxMaGCi38ZPWbUZBhkVDc5eadCHszzbcOdgdEZ6be+AZBsWst+Zw==b3f23812448e7e8876e35a291d633861713321fe15b18c71f0d54abb899005c9princeofnigeria 
server-message: O1xxQAi2Y7RVHCgXoX8+AmWlftjSfsrA/yFxMaGCi38ZPWbUZBhkVDc5eadCHszzbcOdgdEZ6be+AZBsWst+Zw==b3f23812448e7e8876e35a291d633861713321fe15b18c71f0d54abb899005c9princeofnigeria 

有誰知道哈希爲什麼不同?我認爲如果它是相同的協議/算法,它將始終產生相同的散列。

編輯:哇。我去的這online hashing tool和它相同的消息產生又一摘要:

4509a6d5028b217585adf41e7d49f0e7c1629c59c29ce98ef7fbb96c6f27502c 

編輯編輯:關於第二個想法,在網上散列工具是不同的,可能是因爲它採用了hex編碼和我用base64

+0

我得到了與在線哈希工具相同的一個。你確定你沒有改變客戶端和服務器之間的字符串編碼嗎?也許序列化協議或從ASCII到UTF或更改?只是有點不同會給出完全不同的散列。 – dhj

+0

@dhj我不認爲編碼改變了任何東西。我將所有的隨機數轉換爲base64,所以一切都是字符串。我還控制檯在瀏覽器和服務器上記錄了散列消息,並將它們進行比較(問題中的散列消息是從控制檯輸出粘貼的副本)。 – Joshua

+1

那麼服務器和客戶端摘要肯定是兩種不同的結果編碼。客戶端在十六進制服務器可能base64。 SHA256將始終返回一個256位摘要。 – dhj

回答

5

的問題確實與編碼。

看在客戶端實現:

var password_hash = CryptoJS.SHA256(message).toString(CryptoJS.enc.Base64);

CryptoJS.enc.Base64參數實際上需要的是我並沒有包括CryptoJS庫的另一個組件(存儲在一個js文件:enc-base64-min.js)。所以,如果沒有有效的編碼類型,它默認爲hex

感謝@dhj您指出的編碼問題!

1

的問題是,您的客戶端產生的十六進制編碼消化,而服務器使用base64編碼。