Argon2 從一個密碼派生出兩個密鑰
這不是重複的,我在問哪種方法更好。我生成了一個編碼的 argon2 雜湊字元串,因此它將儲存在數據庫中以驗證登錄密碼。
保存的編碼雜湊具有長度為 16 字節的鹽和長度為 32 字節的標籤。我需要使用兩個參數從保存的密鑰派生出第二個不同的密鑰:
- 使用者密碼
- 已存在的已保存雜湊
方法
我知道如何去做,但我不確定它的安全性。我不想派生雙倍長度的散列並使用前半部分儲存在數據庫中,第二部分用於加密。方法:
- 獲取已保存雜湊的現有鹽
生成64字節的tag,取後半部分(跳過32字節)
- 儲存的散列將僅具有 32 字節的派生密鑰長度並且不會被截斷,此時驗證程序將生成更長的 anthoner(64 字節)標籤並將後半部分用於加密。
- 我想使用這種方法,因為它不需要兩種不同的鹽,但它安全嗎?我不知道如何解釋它,所以範例在底部。
- 生成兩種不同的鹽,並使用一種派生標籤進行身份驗證,並使用第二種鹽派生密鑰進行加密。
- Argon2id 是否容易受到相關密鑰攻擊?
方法一解釋
- 使用者在文本框“test”中輸入密碼,然後按下按鈕進行註冊
使用隨機鹽(16 字節)和 32 字節標籤創建密碼雜湊
$argon2id$v=19$m=16,t=2,p=1$SXRkQkVmdGNEMkpMdVEzSg$E015KNeeAHdB0XViXANRjVQN+fKZjWxJbGaGq6CI7/A
- 導出加密密鑰
採用相同的密碼,相同的參數和相同的鹽
使用相同的參數派生 64 個字節(所以它會是
$argon2id$v=19$m=16,t=2,p=1$SXRkQkVmdGNEMkpMdVEzSg$H+6e3H9iFaRr4+lW/uAicAgb6y8LtSKn0DymU0/0/wnbsEOHQfHSYr9C1lDQmv1UfzyJzOShVKvJm17h6Hcr7Q
)
後半部分(跳過 32 個字節並取其他 32 個字節)將是加密密鑰
bsEOHQfHSYr9C1lDQmv1UfzyJzOShVKvJm17h6Hcr7Q
將是加密密鑰我不會生成前 64 個字節,只保存前 32 個使用者註冊字節,我只生成 32 個字節,驗證時多 2 倍,所以 64 個字節——我將使用接下來的 32 個字節進行加密。
很快,註冊時將生成一個32 字節的標籤。當登錄並導出加密密鑰時,程序將採用儲存的雜湊及其參數(TimeCost、Parallelism、MemoryCost、Salt)並根據相同的密碼創建一個 64 字節的標籤。第二個 32 字節將是加密密鑰。
**我做空:**這兩種方法都安全嗎?哪個更好?我覺得第一個更好。
請注意我使用 Argon2id,謝謝。我也知道由於 Blake2 雜湊長度,我不能從 Argon2 獲得超過 512 位的安全性。
我希望我已經正確理解了請求。我認為這兩種方法都沒有很大的弱點。但我認為整個方案比單次執行 Argon2 更不安全。起初這聽起來違反直覺。對於基於密碼的密鑰派生,它還歸結為在可接受的時間內使用盡可能多的記憶體。一次執行 Argon2 可以同時使用比拆分它更多的記憶體。如果你想從第一個密鑰派生出第二個密鑰,那麼使用像 HMAC 或 HKDF 這樣的方案,因為你沒有輸入熵很小的密碼。在這裡使用 Argon2 只會浪費時間,您應該花時間從密碼中派生出(第一個)密鑰。
對我來說,兩次使用密碼也沒有意義。實際上,好的做法是盡快刪除密碼。
相關密鑰攻擊適用於密碼。
我不確定,你的目標是什麼,但這裡有一些想法:
僅使用
- 使用者密碼
- 已存在的已保存雜湊
目標
- 256 位/32 字節的兩個秘密
方法
- 不同的鹽:例如 salt = salt1 + salt2 , keyE = argon(userPw,salt1) , keyR = argon(userPw,salt2)
- 不同的鹽:例如 salt1 = h(“SALT1” + salt) , salt2 = h(“SALT2” + salt) , keyE = argon(userPw,salt1) , keyR = argon(userPw,salt2)
- 擴展秘密:使用 argon2 獲得一個 256 位秘密,而不是用給定的最終值擴展它並使用加密雜湊函式,例如 keyB = argon(userPw,salt) , keyE = h(“ENCRYPTION”, keyB,10.000) , keyR = h(“註冊”,keyB,10.000)
- 擴展輸入:修改 argon2 的輸入以獲得兩個不同的 256 位密碼,例如 keyE = argon(“ENCRYPTION” + userPw,salt) , keyR = argon(“REGISTRATION” + userPw,salt)
- 使用不同的雜湊值,例如 pbkdf 和 argon2
- …
它在很大程度上取決於實施、目標和攻擊模型。
好像不是最好的
採用相同的密碼,相同的參數和相同的鹽