SHA256 雜湊可以被視為安全密鑰證明嗎?
我想使用 PBKDF2 進行 1,000,000 次迭代(我還不知道我將選擇多少次)從使用者提供的密碼(至少 40 位熵)中派生一個 256 位對稱密鑰K。然後我想證明使用者擁有/知道密鑰K。密鑰將使用 SHA256 函式進行一次散列,結果H將儲存在數據庫中 (SHA256(key))。因此,每當我需要驗證使用者是否擁有密鑰K時,它將在前端進行雜湊處理,並且只有H值將發送到伺服器,因此我可以將其與儲存在 DB 中的值進行比較。密鑰永遠不會離開使用者的電腦。
假設黑客想要找出 256 位密鑰是什麼。有兩種方法:
- 蠻力密碼 - 由於我們使用的是慢速散列函式 (PBKDF2) 和至少 40 位的熵密碼,因此需要數年時間。
- 嘗試從“對方”攻擊找出關鍵。因此,黑客需要找到一個原像,即雜湊H的密鑰*K。*我們知道 SHA256 是單向函式,所以幾乎是不可能的。
問題是:此解決方案是否存在任何可能的漏洞?我知道找到 SHA256 的 256 位隨機原像是不可能的,但我們在這里處理的不是加密安全隨機數生成器生成的“真實”256 位值。我們正在處理的 256 位密鑰K實際上源自使用者密碼,其熵要低得多,比方說只有 40 位。
我的理解是,從第二次攻擊的角度來看,我們可以將密鑰K視為真正的 256 位值,因為我們必須找出確切的 256 位值。我們不必擔心它來自具有 40 位熵的源。我們只需要在第一種情況下擔心這一點,所以這就是我想使用慢散列函式的原因。
結論:通過第一種攻擊方式而不是第二種攻擊方式更有可能找到密鑰K,因此只有一個 SHA256 散列輪是安全的。如果我想讓整個解決方案更安全,我應該考慮更多的 PBKDF2 迭代,或者應該用更好的函式(如 Argon2)替換 PBKDF2。我對嗎?
然後我想證明使用者擁有/知道密鑰 K。密鑰將使用 SHA256 函式進行一次散列,結果 H 將儲存在數據庫中 (SHA256(key))。因此,每當我需要驗證使用者是否擁有密鑰 K 時,它將在前端進行雜湊處理,並且只有 H 值將發送到伺服器,因此我可以將其與儲存在 DB 中的值進行比較。
這如何證明客戶端(可能偽裝成使用者)知道密鑰?他顯然知道 SHA256(密鑰),但他可能是從真實使用者那裡得到的。
即使客戶端和伺服器之間的協商是加密的(您沒有指定),攻擊者獲取該值的一種明顯方法是假裝是真正的伺服器,並讓客戶端嘗試登錄(並且客戶端將發送該 SHA256(key) 值作為交換的一部分)。
SHA-256 通常用於指紋辨識或密鑰檢查值 (KCV) 的計算,即使在硬體安全模組 (HSM) 中也是如此。由於散列是一種單向函式,它應該是安全的。但是,這僅用於辨識密鑰,而不是證明您擁有密鑰。
需要擔心的一件事是密鑰是否用於包括散列在內的其他目的。在這種情況下,您可能會遇到域分離問題。在這種情況下,您可以考慮使用 HMAC 或 KDF 計算,使用(可能)唯一的字元串作為輸入消息(鍵旁邊)。
是的,與往常一樣,PBKDF 比校驗值的雜湊計算更容易受到攻擊。你應該專注於這一點。