是否有任何高級記憶體硬 PBKDF 結構?
來自PKCS #5 v2的PBKDF2構造具有方便的特性,它可以僅使用標準的可互換加密原語來實現。具體來說,它只需要合適的 PRF 的可用性,通常通過 HMAC(另一種高級加密結構)使用標準加密散列函式來實現。因此,PBKDF2 可以很容易地在任何提供對合適雜湊函式的訪問的加密庫之上實現,即使該庫本身並不直接實現 PBKDF2(甚至 HMAC)。
然而,雖然 PBKDF2 實現了一個可調整的工作因子(以迭代計數的形式)來阻止暴力破解密碼嘗試,但它只使用了相當少量的記憶體。這使其容易受到使用並行計算硬體(如 GPU、FPGA 或專用 ASIC)的攻擊。
近年來,已經開發了幾種“記憶硬”的基於密碼的密鑰派生函式,例如scrypt和Argon2來解決這個問題。然而,這些功能都傾向於使用許多加密庫尚未(尚未)實現的特定非標準原語,並且如果不是不可能的話,用高級程式語言從頭開始安全有效地實現這些原語是很困難的。
因此,我的問題是:是否有任何記憶體硬 PBKDF 結構可以僅使用常見的標準加密原語(如(通用)散列函式和/或分組密碼)來實現?
理想情況下,構造的安全性應該很容易簡化為對底層原語的合理安全假設。我確實懷疑對於某些方面(特別是記憶體硬度),這種減少可能不是微不足道的,但希望仍然可以證明。
此外,為了非常適合在高級語言中實現,理想情況下,該構造應該僅使用對底層加密庫的相對少量高級呼叫即可實現。例如,理想情況下,基於分組密碼的結構應該將大部分時間用於在廣泛實施的操作模式(如(批量)ECB 或 CBC)中對批量數據執行密碼,而不是需要重複的高級呼叫來加密單個塊. 類似地,對於基於散列的構造,對於大多數散列呼叫來說,在相當長的輸入字元串上是理想的。(請注意,PBKDF2-HMAC 未能滿足此附加要求,在短字元串上重複呼叫雜湊。)
附言。這個較早的問題是一個很好的例子,說明了這種構造對以下情況有用的案例:
“我受限於涉及 PHP 的特定環境,目前無法實現新的記憶體硬散列,例如 scrypt(我也不想與 scrypt 之類的東西競爭)。
我目前的密鑰派生只是 HMAC(密碼+鹽)的迭代。但似乎使用 AES 或其他加密密碼,可以使用內置的 PHP 功能(如 HMAC 和 AES 加密)建構一個相當簡單的記憶體硬密鑰派生函式(假設 PHP 編譯時支持 openssl)。
唉,他們提議的結構實際上似乎並不難記憶。我一直在考慮可能的替代結構來實現相同的目標,但在投入大量時間和精力分析它們的安全性和記憶難度之前,我想我首先要問這是否已經是一個已解決的問題。
是否有任何記憶體硬 PBKDF 結構可以僅使用常見的標準加密原語(如(通用)散列函式和/或分組密碼)來實現?
當然有,它甚至在PHC獲得了“特別認可” : Catena。
我不會在這裡詳細介紹 Catena(這篇論文在 50 多頁上做得更好),但它帶有基於 pebble 遊戲的安全性降低、嚴格的安全性證明、預設實例和許多可自定義的參數(即四):
- 它使用加密原語,該論文建議 Blake2b,但實際上任何雜湊都可以,您可以快速計算
- 它使用舍入簡化的加密原語,儘管完整的版本也可以使用
- 它需要一個可選的隨機化層來加強記憶體初始化
- 它需要一些“記憶困難”功能
最後,它使用所有這些參數和一個聰明的圖形驅動數據流來實現現代密碼雜湊所期望的基本上所有期望的屬性。
注意:提供了後兩個選項的預設參數,因此使用者基本上可以根據自己喜歡的雜湊在兩個 Catena 變體之間進行選擇。
在密碼散列比賽之後出現的另一種選擇是氣球散列。它可以使用任何標準的加密散列函式,因為它是唯一的加密原語;所有其他操作都是簡單的連接或異或,幾乎可以用任何高級語言完成。我什至使用
HASHBYTES()
帶有 SHA-256 的函式在 Microsoft T-SQL 中實現了它。Balloon 散列紙包括對 Argon2 的攻擊作為獎勵。