2017-08-09 43 views
1

我有一個對象,我想在節點中用sha256散列。該對象的內容是簡單的Javascript類型。例如起見,讓我們說:從節點中的對象生成一致的sha256散列

var payload = { 
    "id": "3bab3f00-7d55-11e7-9b0a-4c32759242a5", 
    "foo": "a message", 
    "version": 7, 
}; 

我創建這樣的哈希:

const crypto = require('crypto'); 
var hash = crypto.createHash('sha256'); 
hash.update(...).digest('hex'); 

的問題是,如何通過更新? documentation for crypto說你可以通過一個<string> | <Buffer> | <TypedArray> | <DataView>,這似乎表明一個對象是不是一件好事情通過。我不能使用toString()因爲打印"[object Object]"。我可以使用JSON.stringify,但是我已經在其他地方閱讀過,stringify的輸出不能保證對於相同的輸入是確定性的。

還有其他的選擇嗎?我不想從NPM下載一個軟件包。

+0

你能解釋你爲什麼這樣做嗎?這可能會提供如何的瑣碎想法。 – Paul

+0

我想任何人都想散列任何東西......以創建對象內容的可重複摘要的相同原因:a)與對象的散列不同,並且b)難以僞造 –

+0

因此,這是我找到的幾個npm模塊之一經過簡單的Google搜索。如果他們不滿足你的需求,他們可能會提出想法。 https://github.com/puleos/object-hash/blob/master/readme.markdown – Paul

回答

2

正確的術語是「規範的」,行動被稱爲「規範化」(我在這裏假設EN-US),你可以找到一個產生規範輸出的字符串化輸出here

請注意,您必須確保輸出也具有正確的字符集(首選UTF-8)和行結束符。虛假數據不應該存在,例如一個字節順序標記或NUL終止字符串足以使散列值無效。

之後,你可以通過它作爲string我想。


當然,你可以使用任何規範的編碼。請注意,XML定義了XML-digsig,其中包含在簽名生成和簽名期間的規範化,這意味着如果更改XML代碼,則驗證甚至會成功(不會更改結構或內容,但空白/縮進不會物)。


我仍然建議在庫的實現和版本更新之間進行迴歸測試。

+0

請注意,JavaScript和JSON是爲了方便使用而創建的,而不是嚴格的。不幸的是,安全性和密碼學要求嚴格。因此你需要更多的測試來創建一個安全的實現。我並不是說這是好還是壞,只是它**是**。 –