跳到主要内容

2. HMAC-based Key Derivation Function (基于 HMAC 的密钥派生函数)

2. HMAC-based Key Derivation Function (基于 HMAC 的密钥派生函数)

2.1. Notation (符号表示)

HMAC-Hash 表示使用哈希函数 'Hash' 实例化的 HMAC 函数 [HMAC]。HMAC 总是有两个参数: 第一个是密钥, 第二个是输入 (或消息)。(请注意, 在提取步骤中, 'IKM' 用作 HMAC 输入, 而不是作为 HMAC 密钥。)

当消息由几个元素组成时, 我们在第二个参数中使用连接 (用 | 表示); 例如, HMAC(K, elem1 | elem2 | elem3)

本文档中的关键词 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY" 和 "OPTIONAL" 应按 [KEYWORDS] 中描述的方式解释。

2.2. Step 1: Extract (步骤1: 提取)

HKDF-Extract(salt, IKM) -> PRK

Options (选项):

  • Hash: 哈希函数; HashLen 表示哈希函数输出的长度 (以八位字节为单位)

Inputs (输入):

  • salt: 可选的盐值 (非秘密的随机值); 如果未提供, 则设置为 HashLen 个零的字符串。
  • IKM: 输入密钥材料 (input keying material)

Output (输出):

  • PRK: 伪随机密钥 (pseudorandom key, HashLen 个八位字节)

输出 PRK 的计算如下:

PRK = HMAC-Hash(salt, IKM)

2.3. Step 2: Expand (步骤2: 扩展)

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

Options (选项):

  • Hash: 哈希函数; HashLen 表示哈希函数输出的长度 (以八位字节为单位)

Inputs (输入):

  • PRK: 至少 HashLen 个八位字节的伪随机密钥 (通常是提取步骤的输出)
  • info: 可选的上下文和应用特定信息 (可以是零长度字符串)
  • L: 输出密钥材料的长度 (以八位字节为单位) (<= 255*HashLen)

Output (输出):

  • OKM: 输出密钥材料 (output keying material, L 个八位字节)

输出 OKM 的计算如下:

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

其中:

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)
...

(其中连接到每个 T(n) 末尾的常量是单个八位字节。)