Key-Derivation

是否有可以安全地在同一個秘密上並行使用的密鑰派生函式?

  • June 23, 2016

我正在考慮使用密鑰派生方案從同一個使用者密鑰生成多個密鑰。重要的是,除了這些派生密鑰中的一個以外,計算最後一個密鑰是不可行的。可調難度將是一個很大的優勢。

是否有這樣一個或一組函式可以安全地在同一個秘密上並行使用?

這不是這個問題的重複,因為我沒有任何方法可以在不同設備之間儲存客戶端鹽。使用常量會起作用,因為它可以儲存在原始碼中,例如sha256(user_secret + "first_static_salt"),但我不知道這樣的方案是否安全。我也沒有該問題的相同參數相同的密鑰派生功能要求。使用三個不同的功能對我來說很好。

編輯:我只有熵的使用者密碼。使用的任何使用者特定的鹽都必須儲存在伺服器上,這意味著所有相關方都知道它(除非您使用使用者密碼對其進行加密……)。

這裡的目標是對伺服器隱藏敏感數據;它們只需要元數據才能正常執行,因此沒有理由通過它們發送敏感數據。目前設置將使用兩種不同的密鑰,一種用於與伺服器進行身份驗證,另一種用於加密/解密實際數據。大多數伺服器只會推送 uuid,這些 uuid 將用於訪問儲存實際敏感加密數據的單獨系統。然後,客戶端將與這兩個獨立的系統進行互動。

您需要將其拆分為兩個單獨的問題:

  1. 你可能有一個低熵密碼(因為你表示你想要“可調難度”);
  2. 您需要特定使用者的密鑰,以免洩露有關密碼或其他密鑰的任何資訊。

讓我們分兩步解決這個問題:

首先,您需要一個鹽和一個工作因子或迭代計數。您可以通過選擇安全密碼雜湊或基於密碼的密鑰派生函式 (PBKDF) 來執行此操作。可通過的選項包括 PBKDF2、bcrypt、scrypt 和 Argon2(從標準化/可用到安全排序)。

您已經表示您擔心伺服器知道鹽。然而,這不是問題,因為鹽可能是一個眾所周知的值。鹽主要用於確保:

  1. 在找到匹配項之前,您無法使用單個鹽搜尋各個使用者的所有密碼雜湊結果;
  2. 通過查看密碼雜湊結果,您無法找到重複密碼的跡象。

好的,所以現在你應該有一個取決於密碼和公開可用的鹽的秘密。可以簡單地創建一個大秘密並將其拆分為多個密鑰。PBKDF 的輸出應該與隨機無法區分,只要您沒有錯誤地在鍵之間有重疊,鍵就應該彼此獨立。

然而,在此步驟中使用基於密鑰的密鑰派生函式 (KBKDF)(例如 HKDF)要好得多。然後,您將使用 PBKDF 的結果作為 KBKDF 的鍵。在這種情況下,您可以為每個鍵使用標籤,例如Authentication_keyand Data_encryption_key。這些密鑰都依賴於主密鑰,但否則它們將相互獨立。

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