Encryption

無法訪問 HKDF 時使用 PBKDF2?

  • October 7, 2021

我想為每個通過 AES256 CBC 和 HMAC-SHA256 加密和身份驗證的有效負載使用唯一的加密密鑰和 authKey。我正在考慮以下幾點:

Salt = 32 random bytes, unique to each payload, stored out in the open.
MasterKey = 32  random bytes, chosen once ever, stored securely
EncKey||AuthKey = PBKDF2(MasterKey, Salt, iterations) 

其中 EncKey 將是 32 個字節,用作 AES256CBC 的加密密鑰,而 AuthKey 將是 64 個字節,用作 HMAC-SHA256 的 hashKey。

從我對 crypto.stackexchange.com 的閱讀中,我了解到 HKDF 可能是用於派生 EncKey 和 AuthKey 然後 PBKDF2 的更好功能,但在我處於 (.Net) 的開發環境中,我無法從權威來源。

可以為此目的使用 PBKDF2 嗎?如果是這樣,使用高迭代次數(如 100,000)還是使用低迭代次數(如 1)更好?

從我對 crypto.stackexchange.com 的閱讀中,我了解到 HKDF 可能是用於派生 EncKey 和 AuthKey 然後 PBKDF2 的更好功能,但在我處於 (.Net) 的開發環境中,我無法從權威來源。

謹慎是勇氣的更好部分,因此嘗試和使用您的環境提供的算法而不是必須實現自己的算法往往是有意義的。但是,在這種情況下,我認為我們有一個合理的例外。如果您的環境提供 PBKDF2,因此可能是 HMAC,我認為 HKDF 很簡單,我會說只需編寫您自己的實現即可。最有用的來源是 RFC:

特別是,如果你MasterKey已經是均勻分佈的,第 3.3 節告訴你可以跳過HKDF-Extract函式(第 2.2 節)並只實現HKDF-Expand(第 2.3 節),這只不過是一個相當簡單的 HMAC 呼叫鏈:

HKDF-Expand(PRK, info, L) -> OKM

Options:
  Hash     a hash function; HashLen denotes the length of the
           hash function output in octets
Inputs:
  PRK      a pseudorandom key of at least HashLen octets
           (usually, the output from the extract step)
  info     optional context and application specific information
           (can be a zero-length string)
  L        length of output keying material in octets
           (<= 255*HashLen)

Output:
  OKM      output keying material (of L octets)

The output OKM is calculated as follows:

N = ceil(L/HashLen)
T = T(1) | T(2) | T(3) | ... | T(N)
OKM = first L octets of T

where:
T(0) = empty string (zero length)
T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)
T(2) = HMAC-Hash(PRK, T(1) | info | 0x02)
T(3) = HMAC-Hash(PRK, T(2) | info | 0x03)
...

(where the constant concatenated to the end of each T(n) is a
single octet.)

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