跳到主要内容

8. 密码学计算

为从安全参数生成所需数量的密钥材料,TLS 使用一组称为伪随机函数(PRF)的算法来描述。本备忘录对 TLS 1.0/1.1 中使用的 PRF 进行了一些修改,以更好地支持密码套件协商。

8.1. 主密钥​

主密钥是客户端和服务器通过握手协议协商的秘密值,并用于派生各种密钥。它由预主密钥、客户端随机数和服务器随机数生成。

在 RSA 密钥交换中,客户端生成 48 字节的预主密钥,其中前两个字节包含客户端支持的协议版本(而不是实际协商的版本),其余 46 字节为随机值。然后,客户端使用服务器证书中的公钥加密预主密钥,并通过 ClientKeyExchange 消息发送。如果 RSA 解密失败,服务器将生成一个新的预主密钥,并使用它来生成错误的完成消息(finished message)。

在 Diffie-Hellman 密钥交换中,预主密钥是由 Diffie-Hellman 密钥协商导出的共享秘密。如果此共享秘密的长度超过 2^16-1 字节,则必须仅使用最左边的 2^16-1 字节。

在匿名密钥交换中,不会进行身份认证。

8.2. 密钥扩展​

要生成密钥块(key block),握手协议使用 PRF 从主密钥、服务器随机数和客户端随机数派生密钥块。key_block 的长度等于 key 材料所需的总长度(即所有密钥长度之和)。

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

key_block 被分割为:

client_write_MAC_key[SecurityParameters.mac_key_length]
server_write_MAC_key[SecurityParameters.mac_key_length]
client_write_key[SecurityParameters.enc_key_length]
server_write_key[SecurityParameters.enc_key_length]
client_write_IV[SecurityParameters.fixed_iv_length]
server_write_IV[SecurityParameters.fixed_iv_length]

当在握手期间协商 AEAD 密码时,fixed_iv_length 通常为 4 字节;对于其他密码,该值为 0。

8.3. 已完成消息​

Finished 消息的内容由 PRF 通过对所有握手消息进行哈希计算得到。连接的双方都会在握手结束时发送 Finished 消息,以验证握手是否成功。

PRF(master_secret, finished_label, Hash(handshake_messages))[0..11]

其中 finished_label 在客户端为 "client finished",在服务器为 "server finished"。Hash 为 signature_algorithms 扩展中指定的哈希函数(默认 SHA-256)。

8.4. 密码学属性的扩展​

TLS 1.2 使用 signature_algorithms 扩展,以允许客户端向服务器指示其支持的哈希和签名算法组合。

enum {
none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
sha512(6), (255)
} HashAlgorithm;

enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
SignatureAlgorithm;

struct {
HashAlgorithm hash;
SignatureAlgorithm signature;
} SignatureAndHashAlgorithm;

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