2014-10-09 60 views
0

我已經創建了一些字段的散列並使用'crypto'npm存儲在數據庫中。如何從node.js中的散列值獲得原始值

var crypto = require('crypto'); 
var hashFirtName = crypto.createHash('md5').update(orgFirtName).digest("hex"), 

問題:如何在需要時從散列值中獲取原始值?

回答

1

「散列」的basic definition是它是單向的。您無法從哈希中獲取原始值。主要是因爲單個值總是會產生相同的散列值,但散列值並不總是與單個值相關,因爲大多數散列函數會返回一個有限/固定長度的字符串。

其他信息

我想提供一些額外的信息,因爲我覺得我可能已經離開了這個太短。

正如@xShirase在他的回答中指出的那樣,你可以使用一個表來反轉一個Hash。這些被稱爲Rainbow Tables。您可以從互聯網上生成或下載它們,通常來自惡意來源[ahem]。

爲了擴展我的關於可能與多個原始值有關的散列值的其他陳述,讓我們看看MD5。

MD5是一個128位散列。這意味着它可以保存2^128位或(無符號)0到340,282,366,920,938,463,463,374,607,431,768,211,455。這是一個非常大的數字。因此,對於任何給定的輸入,您有340,282,366,920,938,463,463,374,607,431,768,211,456中的一個,它將與另一個輸入值的相同散列結果相沖突。

現在,對於像密碼這樣簡單的數據來說,機會是天文數字。爲了這些目的,誰在乎?大多數情況下,您只是簡單地進行輸入,散列,然後比較散列。由於我不會涉及的原因,在使用哈希密碼時,您應始終保存已經哈希的數據。你不想留下純文本密碼只是說謊。請記住,哈希是不是與加密相同。

哈希也可以用於其他原因。例如,它們可以用來創建一個名爲Hash Table的快速查找數據結構。哈希表使用散列作爲「主鍵」的排序,使其能夠在相對較少數量的指令中搜索大量數據,並接近O(1)(按1的順序)。根據哈希表和散列算法的實現,您必須通常通過排序列表來處理衝突。這就是爲什麼哈希表不是「完全」O(1),而是接近。如果你的散列算法不好,你的散列表的性能可能開始接近O(n)。

散列的另一種用途是判斷文件內容是否已被更改或與原件匹配。您將看到許多OSS項目提供了也具有MD5和/或SHA-2哈希值的二進制下載。這樣您就可以下載文件,在本地執行散列操作,並將結果與​​它們進行比較,以確保您獲得的文件是他們發佈的文件。同樣,由於在340,282,366,920,938,463,463,374,607,431,768,211,456中兩個文件匹配的機率是1,因此黑客成功生成一個具有相同大小的文件並且散列到完全相同的MD5/SHA-2散列的相同大小的文件的機率相當低。

希望這個討論可以幫助你或者將來的某個人。

1

如果你能從哈希中獲得原始值,那麼它就不會那麼安全。

如果您需要將值與以前存儲爲散列的值進行比較,則可以爲此值創建散列並對散列進行比較。

在實踐中,只有一種方法來「解密」散列。它涉及到使用大量的解密哈希數據庫,並將它們與您的數據庫進行比較。 An example here