第三十一章 SSL实现 / 31.6 密钥信息

ssl中的密钥相关信息包括:预主密钥、主密钥、读解密密钥及其iv、写加密密钥及其iv、读MAC密钥、写MAC密钥。

1)    预主密钥

预主密钥是主密钥的计算来源。它由客户端生成,采用服务端的公钥加密发送给服务端。

sslv3为例,预主密钥的生成在源代码s3_clnt.cssl3_send_client_key_exchange函数中,有源码如下:

tmp_buf[0]=s->client_version>>8;

tmp_buf[1]=s->client_version&0xff;

if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)

goto err;

s->session->master_key_length=sizeof tmp_buf;

……

n=RSA_public_encrypt(sizeof tmp_buf,tmp_buf,p,rsa,RSA_PKCS1_PADDING);

 

此处,tmp_buf中存放的就是预主密钥。

2)    主密钥

主密钥分别由客户端和服务端根据预主密钥、客户端随机数和服务端随机数来生成,他们的主密钥是相同的。主密钥用于生成各种密钥信息,它存放在SESSION数据结构中。由于协议版本不同,生成方式也不同。sslv3的源代码中,它通过ssl3_generate_master_secret函数生成,tlsv1中它通过tls1_generate_master_secret函数来生成。

3)    对称密钥和MAC密钥

对称密钥(包括IV)和读写MAC密钥通过主密钥、客户端随机数和服务端随机数来生成。sslv3源代码中,它们在ssl3_generate_key_block中生成,在ssl3_change_cipher_state中分配。