從密碼和另一個密鑰派生一個密鑰?
我想使用密碼加密一些數據。我想使用像 PBKDF2 這樣的功能將我的密碼變成密鑰。但是,我還想需要一個密鑰文件,以增加安全性。我的數據只有在我有密碼和密鑰文件的情況下才能解密。
做這個的最好方式是什麼?
據我了解,我不應該為此目的使用鹽,對嗎?即我可以使用鹽作為我的“密鑰文件”,並使用使用者輸入的密碼作為密碼,但我能找到的大多數文獻不建議以這種方式使用鹽。
所以除了密碼之外,密鑰文件的優勢在於它基本上是一種兩因素身份驗證的形式:你有一個密碼(你知道的東西)和一個令牌(你有的東西)。
問題是您的鹽必須可用才能派生基於密碼的秘密,這意味著您的令牌(鹽)與您的密碼並不能真正分離 - 這意味著您實際上不再具有兩因素身份驗證,因為鹽不能與密碼分開。因此,使用 salt 作為密鑰文件根本不會真正提高安全性。
完成您正在尋找的一種方法是使用 /dev/urandom 或等效方法生成密鑰文件以生成適當大小的令牌(128-256 位)。然後將此密鑰文件保存在 USB 驅動器上。這樣,每當您需要訪問您的秘密時,您既需要知道您的密碼,又需要擁有物理令牌。
驗證密碼和密鑰文件後,您可以通過 hash(keyfile || password_derived_secret) 之類的方式生成單個主密鑰。
據我了解,我不應該為此目的使用鹽,對嗎?即我可以使用鹽作為我的“密鑰文件”,並使用使用者輸入的密碼作為密碼,但我能找到的大多數文獻不建議以這種方式使用鹽。
雖然術語“salt”通常表示該值不是秘密的,但將秘密、高熵密鑰文件的內容作為 PBKDF2 的“salt”參數傳遞應該沒問題。PBKDF2 迭代一個由密碼鍵入的偽隨機函式,並將“salt”作為參數傳遞給初始迭代。所以如果 PBKDF2 也是一個偽隨機函式:
- 既沒有密鑰文件也沒有密碼的攻擊者別無選擇,只能對派生密鑰執行暴力搜尋。
- 擁有密鑰文件但沒有密碼的攻擊者必須猜測密碼。(這與使用公共鹽破解密碼的情況相同。)
- 擁有密碼但沒有密鑰文件的攻擊者需要暴力搜尋密鑰文件的內容,這只有在此搜尋小於對派生密鑰的搜尋時才值得。(這告訴您密鑰文件的內容應該隨機統一選擇,並且大小與派生密鑰的安全級別相同。)
不過,這樣做有充分的理由。例如,許多程序轉而使用密碼派生密鑰作為對稱密鑰加密密鑰來加密隨機生成的數據加密密鑰。PBKDF2 產生統一的隨機位作為輸出,但請記住,並非所有加密算法都接受它作為其密鑰。特別是,公鑰算法通常不會。因此,如果您想要一個可以使用任何格式的密鑰的設計,您可能不想直接使用 PBKDF2 輸出作為數據加密密鑰。