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 官方英文原文进行核对。