單個 md5 散列是生成 AES 密鑰的好方法嗎?
該站點說明瞭如何使用密碼在 go 中使用 AES-GCM 加密數據。
它說:
在加密和解密數據時,使用 32 個字元或 32 個字節的密鑰很重要。現實一點,您可能會想要使用密碼片語,並且該密碼片語的長度永遠不會是 32 個字元。
為了解決這個問題,您實際上可以使用產生 32 字節散列的散列算法來散列您的密碼。我在 Wikipedia 上找到了提供輸出長度的雜湊算法列表。我們將使用一個簡單的 MD5 雜湊。這是不安全的,但這並不重要,因為我們不會儲存輸出。
這是真的?
很好,我不介意使用比 MD5 更安全的東西,用 SHA-2 替換 MD5 很容易。
但另一件事打動了我:
- 為什麼不需要像 bcypt/scrypt 這樣的東西?
- AES 是否足夠慢以防止暴力攻擊?
假設密碼/片語實際上是密碼/片語,並且還沒有包含足夠的複雜性來防止猜測(例如,不是加密強的隨機字元串)……
這是真的?
不會。攻擊者會簡單地猜測密碼,而快速雜湊函式將幫助他們更快地猜測。攻擊者每秒可以嘗試非常荒謬的 md5 雜湊值,並且肯定會破壞任何不是生成的密碼強度高的密碼/密碼。
為什麼不需要像 bcypt/scrypt 這樣的東西?
需要慢散列,文章中的資訊不是好的建議。選擇 MD5 是因為它提供了開箱即用的正確摘要大小是不合理的:存在更強的 256 位散列函式(例如 SHA256),並且可以輕鬆地將更大的散列摘要截斷為 256 位
密碼散列函式不適用於密碼/密碼片語。
AES 是否足夠慢以防止暴力攻擊?
不,要緩慢防止對密鑰的暴力攻擊不是密碼的責任。假設它們的密鑰足夠強大,可以稱為密鑰(例如,均勻隨機的位串),那麼使用慢速密碼是完全無效的。
因此,防止猜測攻擊的緩慢責任落在了加密發生之前的一步,即密鑰推導步驟。Bcrypt/Scrypt/Argon2 等函式是專門為此目的而設計的。
或者
如果密碼是隨機生成的,並且設計為具有足夠的熵,那麼使用慢速密鑰推導過程就不是真正必要或有益的。在這種情況下,使用像 HKDF這樣的東西可能是最合適的。
任何狀況之下
從列表中選擇 MD5,因為它看起來不錯不是一個好兆頭…
這是真的?
雖然正如作者所說,沒有儲存雜湊並且沒有對 MD5 的原像攻擊,但 MD5 的問題是;它非常快,即對密碼的強力執行可以比 SHA-1快4 倍,比 SHA-3 快 30 倍。如果我們假設我們有一個明文-密文對,我們可以非常快速地搜尋密碼。
為什麼不需要像 bcypt/scrypt 這樣的東西?
需要,因為;Bcrypt 使用可配置的迭代計數,以便您可以降低密碼搜尋的速度。10 次迭代,慢 10 倍,100 次迭代,慢 100 倍,等等。
AES 是否足夠慢以防止暴力攻擊?
有趣的是,我們實際上需要快速且安全的分組密碼。AES 並不慢,問題是密鑰大小甚至最小 $ 2^{128} $ 對於蠻力攻擊是不可行的。