Password-Hashing

SHA256 雜湊數組建構和散列結果對於密碼儲存有哪些弱點?

  • October 11, 2020

你分配了一個 1MB 的數組。對密碼加鹽(這是除了最後儲存之外唯一使用加鹽的時間)並使用 SHA256 對密碼進行 8 次雜湊處理。放置第一個雜湊的 31,250 個副本(125,000 個是錯誤的)以填充數組,因此在該過程完成之前,它不能被取消分配或用於其他任何事情。然後,您將第一個散列用作 1MB 數組的鹽,並將整個數組用散列加鹽 8 次,並將結果的副本放在數組的第二個 1 KB 塊中。不斷重複散列和填充過程,直到逐步覆蓋整個 1 MB 數組,然後最終散列整個 1 MB。那是您儲存在鹽旁邊的雜湊值。

我嘗試的預設值是 8,000 SHA-256 雜湊值,記憶體要求為 1 MB。

如果使用者想要更高的記憶體要求,陣列可以是 1 MB、2 MB,最多可能是 8 MB。該算法只是簡單地複制中間雜湊 125 次、250 次等。如果使用者想要更多的迭代,則每個雜湊執行 8 次、16 次、32 次等之間的某個位置。

我正在努力做到這一點,因此攻擊者無法在整個持續時間內取消分配 1 MB 數組或將其用於其他任何事情。

在保護密碼免受離線攻擊方面,這將如何與 BCrypt 或 SCrypt 相提並論?

這個問題的構造是嘗試製作一個記憶困難的功能。這比看起來要困難得多,並且提出的結構有幾個缺陷:

  1. 執行密碼字典攻擊的對手每個並發執行的程序只需要兆多一點的記憶體。這是因為攻擊者並不一定會“將第一個雜湊的 31,250 個副本填充到數組中”;他們可以利用這樣一個事實,即在過程中的最後一次通過之前,最後一個副本不會被更改(與最後一個副本不同)。對於大 $ n $ ,這允許幾乎執行 $ 2n $ 僅使用 $ n $ 兆字節的記憶體。
  2. 獨立地,攻擊者可以通過注意到通常情況下,在閱讀“用雜湊鹽對整個數組進行 8 次雜湊處理”的步驟中,攻擊者可以節省大約 1/16 的雜湊工作量,這是雜湊值的開始(平均 0.5 MB / 8 MB) 與上一步中的相同。
  3. 很難排除使用 ASIC(或者可能是 FPGA)進行密碼字典攻擊的對手可以組織事物,以便每個程序所需的一些(半)兆字節記憶體可以位於相對較慢/便宜的記憶體中,例如片外 DRAM,而在快速片上靜態 RAM觸發器中則很少。
  4. 在 SHA-256 內部塊散列中,相當大的一部分計算工作用於所謂的 64 字節消息塊的擴展。由於整體算法散列的大部分數據都經過多次散列,並且與 64 字節塊的對齊方式相同,因此理論上可以記憶體擴展的消息塊並節省大部分擴展工作。當重複散列相同的數據塊時,這是非常值得的,由於缺陷 1,這幾乎有一半的時間發生。

缺陷 1 可以通過添加一個執行多次的外部循環來修復,因此在所有這些循環中,除了第一個循環之外,儲存器陣列的 32 字節塊具有不同且類似任意的內容。然而,這加劇了缺陷 3 變得嚴重的風險,和/或比 DRAM 更慢/更便宜的記憶體變得可用的風險。

缺陷 2 可以通過在開始每個散列之前增加第一個塊的第一個字來修復。

缺陷 3 是理論上最難擊退的。使用數據相關地址可能會有所幫助,但也往往會減慢合法使用的速度,並且可能會引入不良的側通道洩漏。

在缺陷 1 被修復後,缺陷 4 變得僅僅是理論上的:利用它需要大量額外的記憶體,因此在實踐中這很可能不值得。


記憶硬函式就像大多數加密:任何人,從最無知的業餘愛好者到最好的密碼學家,都可以創建一個他們無法破解的函式(布魯斯施奈爾)。因此,謹慎的做法是使用通過審查的;或者如果目標是學習,那就去研究它。目前公認的標準是Argon2Balloon也值得一讀。

引用自:https://crypto.stackexchange.com/questions/84466