Skip to main content

5. HMAC and the Pseudorandom Function (HMAC和伪随机函数)

TLS记录层使用带密钥的消息认证码 (MAC, Message Authentication Code) 来保护消息完整性. 本文档中定义的密码套件使用一种称为HMAC的结构, 如 [HMAC] 中所述, 它基于哈希函数. 如果需要, 其他密码套件可以 (MAY) 定义自己的MAC结构.

此外, 需要一种结构来将秘密扩展为数据块, 用于密钥生成或验证的目的. 这个伪随机函数 (PRF, pseudorandom function) 接受秘密, 种子和标识标签作为输入, 并产生任意长度的输出.

在本节中, 我们定义一个基于HMAC的PRF. 这个带有SHA-256哈希函数的PRF用于本文档中定义的所有密码套件, 以及在TLS 1.2协商时, TLS 1.2之前发布的TLS文档中的密码套件. 新的密码套件必须 (MUST) 明确指定PRF, 并且通常应该 (SHOULD) 使用带有SHA-256或更强标准哈希函数的TLS PRF.

首先, 我们定义一个数据扩展函数P_hash(secret, data), 它使用单个哈希函数将秘密和种子扩展为任意数量的输出:

P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
HMAC_hash(secret, A(2) + seed) +
HMAC_hash(secret, A(3) + seed) + ...

其中 + 表示连接.

A()定义为:

A(0) = seed
A(i) = HMAC_hash(secret, A(i-1))

P_hash可以根据需要迭代多次以产生所需数量的数据. 例如, 如果使用P_SHA256创建80字节的数据, 它将必须迭代三次 (通过A(3)), 创建96字节的输出数据; 然后将丢弃最后一次迭代的最后16个字节, 留下80字节的输出数据.

TLS的PRF通过将P_hash应用于秘密来创建:

PRF(secret, label, seed) = P_<hash>(secret, label + seed)

标签 (label) 是一个ASCII字符串. 它应该以给定的确切形式包含, 不带长度字节或尾随空字符. 例如, 标签"slithy toves"将通过哈希以下字节来处理:

73 6C 69 74 68 79 20 74 6F 76 65 73