跳到主要内容

5. HMAC 和伪随机函数

TLS 记录协议使用了一个称为伪随机函数(PRF)的算法,用于从密码学参数(如密钥和随机数)生成任意数量的数据。

TLS 1.2 中的 PRF 与 TLS 1.0/1.1 中基于 MD5/SHA-1 组合的实现不同,TLS 1.2 使用基于 SHA-256 的单一哈希函数。

5.1. HMAC​

HMAC 是一种消息认证码,它使用带有密码学哈希函数的密钥。TLS 使用 HMAC,其定义见 [HMAC]。

HMAC(MAC_write_key, seq_num + TLSCompressed.type +
TLSCompressed.version + TLSCompressed.length +
TLSCompressed.fragment);

在 TLS 1.2 中,可以协商不同的哈希函数(例如 SHA-256、SHA-384),因此 MAC 计算使用 mac_algorithm 指定的哈希函数。PRF 始终使用 SHA-256。

5.2. 伪随机函数(PRF)​

TLS 1.2 中的伪随机函数基于 P_SHA256,定义如下:

PRF(secret, label, seed) = P_SHA256(secret, label + seed)

其中 P_hash 定义为:

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_SHA256 使用 SHA-256 作为哈希函数。

PRF 用于从预主密钥、客户端随机数和服务器随机数生成主密钥,并用于从主密钥派生密钥块。

master_secret 的计算方式如下:

master_secret = PRF(pre_master_secret, "master secret",
ClientHello.random + ServerHello.random)

master_secret 长度为 48 个字节。

key_block 的计算方式如下:

key_block = PRF(SecurityParameters.master_secret,
"key expansion",
SecurityParameters.server_random +
SecurityParameters.client_random);

直到生成足够字节为止。然后 key_block 被分割为客户端和服务器各自的 MAC 密钥、密钥和 IV。

注意:本译文由 AI 翻译,可能包含错误。请参考 RFC 5246 官方英文原文进行核对。