【技术文】SSL握手中的几个密码

2020-08-17 16:28:20 浏览数 (1)

  • 一、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 个字节填充一个随机数。结构如下:

代码语言:javascript复制
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 keyClient write MAC key是客户端发数据的session secretServer write MAC secret是服务端发送数据的session keyMAC(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...

0 人点赞