Key-Derivation

Argon2 從一個密碼派生出兩個密鑰

  • November 22, 2022

這不是重複的,我在問哪種方法更好。我生成了一個編碼的 argon2 雜湊字元串,因此它將儲存在數據庫中以驗證登錄密碼。

保存的編碼雜湊具有長度為 16 字節的鹽和長度為 32 字節的標籤。我需要使用兩個參數從保存的密鑰派生出第二個不同的密鑰:

  • 使用者密碼
  • 已存在的已保存雜湊

方法

我知道如何去做,但我不確定它的安全性。我不想派生雙倍長度的散列並使用前半部分儲存在數據庫中,第二部分用於加密。方法:


  1. 獲取已保存雜湊的現有鹽
  • 生成64字節的tag,取後半部分(跳過32字節)

    • 儲存的散列將僅具有 32 字節的派生密鑰長度並且不會被截斷,此時驗證程序將生成更長的 anthoner(64 字節)標籤並將後半部分用於加密。
      • 我想使用這種方法,因為它不需要兩種不同的鹽,但它安全嗎?我不知道如何解釋它,所以範例在底部。

  1. 生成兩種不同的鹽,並使用一種派生標籤進行身份驗證,並使用第二種鹽派生密鑰進行加密。
  • Argon2id 是否容易受到相關密鑰攻擊?

方法一解釋

  1. 使用者在文本框“test”中輸入密碼,然後按下按鈕進行註冊
  • 使用隨機鹽(16 字節)和 32 字節標籤創建密碼雜湊

    • $argon2id$v=19$m=16,t=2,p=1$SXRkQkVmdGNEMkpMdVEzSg$E015KNeeAHdB0XViXANRjVQN+fKZjWxJbGaGq6CI7/A
  1. 導出加密密鑰
  • 採用相同的密碼,相同的參數和相同的鹽

    • 使用相同的參數派生 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 字節的兩個秘密

方法

  1. 不同的鹽:例如 salt = salt1 + salt2 , keyE = argon(userPw,salt1) , keyR = argon(userPw,salt2)
  2. 不同的鹽:例如 salt1 = h(“SALT1” + salt) , salt2 = h(“SALT2” + salt) , keyE = argon(userPw,salt1) , keyR = argon(userPw,salt2)
  3. 擴展秘密:使用 argon2 獲得一個 256 位秘密,而不是用給定的最終值擴展它並使用加密雜湊函式,例如 keyB = argon(userPw,salt) , keyE = h(“ENCRYPTION”, keyB,10.000) , keyR = h(“註冊”,keyB,10.000)
  4. 擴展輸入:修改 argon2 的輸入以獲得兩個不同的 256 位密碼,例如 keyE = argon(“ENCRYPTION” + userPw,salt) , keyR = argon(“REGISTRATION” + userPw,salt)
  5. 使用不同的雜湊值,例如 pbkdf 和 argon2

它在很大程度上取決於實施、目標和攻擊模型。


好像不是最好的

採用相同的密碼,相同的參數和相同的鹽

引用自:https://crypto.stackexchange.com/questions/102863