2017-11-10 223 views
0

我正試圖學習更多關於密碼哈希。我很習慣於Java,並試圖編寫我自己的密碼散列函數。我知道你永遠不應該實現你自己的密碼安全,這純粹是一個學術努力。我做了我自己的HashMap和其他數據結構的實現。如果需要,我會很感激哈希如何工作和代碼片段的描述。我已經搜索了一個答案,但我能找到的是如何使用SHA 256(或其他)來散列密碼。我想讓自己更多地瞭解這些算法。感謝您的幫助。自己實現哈希

p.s. 爲了澄清,我知道有一些算法可以在java中導入哈希密碼。我正在尋找這些函數如何工作的描述,以及如何類似於一個哈希映射,以便我可以嘗試複製它。

+3

這太寬泛了。請求代碼示例和有關散列等主題的教程太多了。你需要什麼特別的幫助? – Carcigenicate

+0

https://en.wikipedia.org/wiki/Cryptographic_hash_function – nicovank

+0

我知道這是一個廣泛的問題,我並不是很難。只需說明密碼的不同之處在於將數據散列到地圖中。我沒有特別尋找任何可以幫助我的項目的信息。 – HoldenDinerman

回答

2

這是一個非常寬泛的問題,但希望有一些高層次的細節可以幫助你。

首先,正如你所說,你通常不應該自己實現一個安全的散列函數,因爲犯錯很容易導致安全漏洞。加密哈希,例如在SHA-2中以各種位強度提供的,是將輸入字節轉換爲指定長度的輸出的單向加密過程。假設有正確的算法,該輸出不能直接轉換回輸入。

在特定的SHA-2算法討論,您可以用維基百科頁面開始:https://en.wikipedia.org/wiki/SHA-2

爲了設計自己的算法,你會想考慮下列因素(如SHA-2等散列算法做,維基百科摘錄):

  • 它是確定性的,因此同樣的消息總是導致相同的哈希
  • 它是快速計算哈希值對於任何給定的消息
  • 是不可行的產生從它的哈希值的消息,除了通過嘗試所有可能的消息
  • 一個小改動的消息應該改變的哈希值如此廣泛,新的哈希值會出現與舊的哈希值不相關
  • 它是不可行的找到具有相同散列值的兩個不同消息

另外,用於特定的密碼哈希:

  • 逆着「快速」上述考慮,密碼散列算法通常選擇n在硬件中較慢並且更難實現(例如, scrypt),以減少在密碼和鹽已知時強制密碼的能力。通常這是通過執行大約1000多輪SHA-2來完成的。

最後,在哈希算法本身之外,確保密碼哈希值是很重要的。此處的鹽指的是在散列之前修改密碼(例如通過將密碼加前綴),其中隨機生成的鹽值也與散列一起存儲。這可以防止密碼哈希的現有或單個字典被用於數據庫中的所有哈希,如果它被破壞(即它迫使攻擊者單獨攻擊每個哈希)。