密碼派生雜湊以加密已知明文作為密碼檢查
標題聽起來太冒險了,因為它實際上是什麼。我目前正在建構一個具有一些加密功能的系統。如果有人對更多上下文感興趣,那麼已經有一個系統在該方案之後建構:https ://stackoverflow.com/a/44925718/5395110 。
作為下一步,我必須計劃使用者身份驗證(典型的使用者名-密碼-登錄)。首先,我想到了使用 Argon2i 散列的標準密碼散列方法。這聽起來很合理,但後來我意識到,如果運氣夠差,我基本上可以讓攻擊者免費獲得數據以及已經建構的系統。為了防止這種情況發生,我考慮將密碼檢查集成到現有系統中,並擺脫以明文形式儲存的任何散列。
我想出了什麼:
- 使用者輸入密碼並發送給伺服器
- 密碼使用 Argon2i => hashed password 進行雜湊處理
- 散列密碼用於解密 AES-256-GCM 保護的密文
- 如果密文可以解密並且等於已知的靜態明文,則解密成功並且密碼有效
所以我的問題是:使用密碼派生密鑰解密經過身份驗證的分組密碼以確定有效性的密碼檢查系統是否是僅保存雜湊的合理替代方案?
優點是沒有可以提取的雜湊,因此攻擊者必須首先找到 AES 容器的密鑰,然後找到 Argon2i 雜湊的明文,這似乎是一項非常不切實際的任務。
我對這種方法的不好感覺是它可能會起作用,但完全錯過了經過身份驗證的分組密碼的意義,因為我實際上正在做的是生成散列密碼(秘密)和已知明文參考密碼的 HMAC(消息) 以一種奇怪且不必要的複雜方式。
老實說,這個想法非常有趣,但沒有多大幫助。AES,主要是因為它被廣泛使用,是一件非常便宜的事情,所以在散列之後基本上只剩下一步,所以這部分不會有太大的不同。但我認為可能有趣的一件事是(但出於不同的原因):
不加密靜態字元串,而是使用雜湊創建或加密使用者註冊時生成的隨機私鑰,同時保持公鑰可讀並將其提供給使用者。
如果您現在使用該特定密鑰簽署某事(類似於金絲雀報告)並且使用者可以檢查它是否使用他的密鑰簽名,那麼他可以相對確定沒有發生密碼重置,因為沒有人無法重置密碼重置鍵。
根據已知的靜態字元串檢查密碼是一種常見的做法,例如在磁碟加密程序中。我看不出你的方案有任何弱點,但我認為這不會增加安全性——正如 My1 已經說過的那樣。
攻擊者必須首先找到 AES 容器的密鑰,然後找到 Argon2i 雜湊的明文,這似乎是一項非常不切實際的任務。
攻擊者會嘗試通過字典攻擊而不是通過密碼分析來查找此雜湊的明文。對於字典攻擊,對短字元串進行額外的 AES 解密沒有任何區別。弱密碼的主要問題不能通過這種方式解決。
如果您可以將鹽或其他隨機字元串保密(胡椒),這也可以保護弱密碼。但是,在 Web 應用程序中,這很難實現。另一種方法是通過使用 ROM 硬度(TB 大小的查找表)來保護雜湊免受殭屍網路處理的字典攻擊。Yescrypt提供了這樣的東西,但 Yescrypt 與 Argon2i 不同,容易受到記憶體定時攻擊。