- 一、Secret Keys
- 二、PreMaster secret
- 三、Master secret
- 四、如上握手的形象比喻
【技术文】SSL握手中的几个密码
今天和大家聊一聊SSL加密。前面其实更新过几篇关于SSL加密的文章,但因为涉及到加密算法、对称非对称、公私钥,所以确实很干,阅读量也并不好。我其实也在迟疑要不是更新这篇终章,因为阅读量不好,我心里其实并不好受,甚至会自我怀疑。
正文开始...
SSL的加密为了平衡安全和效率,做了很多工作,为了SSL的加密过程足够安全,SSL引入了很多密码:
- PreMaster secret
- Master secret
- session secret
随机密码为了足够随机会根据用户键盘结合cpu空闲算出一个随机数,作为初始化密码。而这些随机密码都是能让SSL足够安全。
接下来会比较枯燥,需要一些耐心。
一、Secret Keys
生成过程以及作用流程图:
pre secret key
二、PreMaster secret
PreMaster Secret
是在客户端使用RSA
或者Diffie-Hellman
等加密算法生成的。它将用来跟服务端和客户端在Hello
阶段产生的随机数结合在一起生成 Master Secret
。在客户端使用服务端的公钥对PreMaster Secret
进行加密之后传送给服务端,服务端将使用私钥进行解密得到PreMaster secret
。也就是说服务端和客户端都有一份相同的PreMaster secret
和随机数。premaster_secret
长度为 48 个字节,前 2 个字节是协议版本号,剩下的 46 个字节填充一个随机数。结构如下:
Struct {
byte Version[2];
byte random[46];
}
PreMaster secret
前两个字节是TLS
的版本号,这是一个比较重要的用来核对握手数据的版本号,因为在Client Hello
阶段,客户端会发送一份加密套件列表和当前支持的SSL/TLS
的版本号给服务端,而且是使用明文传送的,如果握手的数据包被破解之后,攻击者很有可能串改数据包,选择一个安全性较低的加密套件和版本给服务端,从而对数据进行破解。所以,服务端需要对密文中解密出来对的PreMaster
版本号跟之前Client Hello
阶段的版本号进行对比,如果版本号变低,则说明被串改,则立即停止发送任何消息。
三、Master secret
上面已经提到,由于服务端和客户端都有一份相同的PreMaster secret
和随机数,这个随机数将作为后面产生Master secret
的种子,结合PreMaster secret
,客户端和服务端将计算出同样的Master secret
。
Master secret
是有系列的hash
值组成的,它将作为数据加解密相关的secret的 Key Material
的一部分。Key Material
最终解析出来的数据如下:
mastersecretkeys
其中,write MAC key
,就是session secret
或者说是session key
。Client write MAC key
是客户端发数据的session secret
, Server write MAC secret
是服务端发送数据的session key
。MAC(Message Authentication Code)
,是一个数字签名,用来验证数据的完整性,可以检测到数据是否被串改。
keyprocess
四、如上握手的形象比喻
如果上面的说明不够清晰,这里我们用个形象的比喻,我们假设A与B通信,A是SSL客户端,B是SSL服务器端,加密后的消息放在方括号[]里,以突出明文消息的区别。双方的处理动作的说明用圆括号()括起。
A:
我想和你安全的通话,我这里的对称加密算法有DES,RC5,密钥交换算法有RSA和DH,摘要算法有MD5和SHA。
B:
我们用DES-RSA-SHA
这对组合好了。这是我的证书,里面有我的名字和公钥,你拿去验证一下我的身份(把证书发给A)。目前没有别的可说的了。
A:
(查看证书上B的名字是否无误,并通过手头早已有的CA
的证书验证了B的证书的真实性,如果其中一项有误,发出警告并断开连接,这一步保证了B的公钥的真实性) (产生一份秘密消息,这份秘密消息处理后将用作加密密钥,加密初始化向量(IV)和hmac的密钥。将这份秘密消息-协议中称为per_master_secret
-用B的公钥加密,封装成称作ClientKeyExchange
的消息。由于用了B的公钥,保证了第三方无法窃听) 我生成了一份秘密消息,并用你的公钥加密了,给你(把ClientKeyExchange
发给B) 注意,下面我就要用加密的办法给你发消息了!(将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥) [我说完了]
B:
(用自己的私钥将ClientKeyExchange
中的秘密消息解密出来,然后将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥,这时双方已经安全的协商出一套加密办法了) 注意,我也要开始用加密的办法给你发消息了![我说完了]
A:
[我的秘密是…]
B:
[其它人不会听到的…]
over...