Pbkdf-2
如果我將秘密附加到鹽或單獨傳遞它,這有關係嗎?
我正在使用 PBKDF2,這是我目前的通話。
key = pbkdf2-hmac-sha256(iterations = 100_000, secret = password ++ salt)
我最近了解到我正在呼叫的函式也需要一個可選
salt
欄位,並且傳遞鹽而不是附加它會給出不同的答案。我目前正在做的事情不安全嗎?我不認為是這樣,但我想保證安全——看起來 PBKDF2 多次使用了這個秘密,但鹽只使用了一次,這可能是有充分理由的。
您一直在做的事情是非正常的,但在密碼學上是安全的,只要實現
pbkdf2-hmac-sha256
正確就應該沒問題。需要注意的事項:
- 所有的東西(字元?)都在裡面
password
並被salt
任何東西安全保存++
嗎?- 然後
secret
將其轉換為八位字節而在輸入時沒有熵損失pbkdf2-hmac-sha256
?將任何非 ASCII 的內容更改?
為已經悄悄發生的蠢事;再加上外語的使用、過度偏執的使用者或字節順序問題,這可能會退化為唯一剩下的密鑰*長度!*另一個可能出現的問題是在secret
.- 當轉換為八位字節時,實現是否正確處理超過 64 個八位字節的
pbkdf2-hmac-sha256
情況?secret
在這種情況下應該執行的操作pbkdf2-hmac-sha256
是用它們的 32 字節 SHA-256 雜湊替換這些字節。鑑於此,我認為非正常使用
pbkdf2-hmac-sha256
可能導致的最糟糕的情況是時序執行可能會以更簡單的方式洩漏長度password
,但這不是問題。在該評論之前,我不知道 100_000 是有效常量的語言。更重要的是,對於 PBKDF2-HMAC-SHA-256、一個簡短的易記密碼和保護密鑰免於窮舉搜尋而言,如今十萬次迭代計數不足。現代基於密碼的密鑰派生函式利用記憶體,有時是多個執行執行緒,在給定的執行時間或成本下大大提高它們的效率,例如scrypt、Argon2、Balloon。
注意:在最終被解釋而不是在某種程度上編譯的東西中實現 PBKDF2-HMAC-SHA-256 的核心將是一個巨大的(但並不罕見)設計錯誤,因為它會強制使用比其他方式可能的迭代次數更低的迭代次數。