正文
==
协议流程
====
我们先来回忆一下HTTPS的通信流程,HTTPS协议 = HTTP协议 + SSL/TLS协议,摘取一下网上一些八股文的回答(以RSA密钥交换的为例)!
-
(1)客户端生成一个随机数client_random,TLS版本号,发送到服务端
-
(2)服务端发送自己的随机数server_random,服务器使用的证书,发送到客户端
-
(3)客户端利用CA公钥对证书进行验证,取出服务器公钥
-
(4)客户端生成随机数pre_master_secret,利用服务器公钥进行加密,传送到服务端
-
(5)服务端利用服务器私钥进行解密取出pre_master_secret
-
(6)服务端和客户端此时利用随机数client_random,server_random,pre_master_secret算出对称密钥(master_secret),利用对称密钥进行对称加密通信
_画外音:_是不是贼熟悉,有背过网络八股文的,一看就懂!
关键问题就在步骤(6),怎么进行加密的?很多文章都没有说明,甚至有的人以为,拿client_random+server_random+pre_master_secret直接拼成一个字符串,然后就是对称加密密钥,客户端和服务端拿这个密钥对数据进行加密通信!!
对此,我只能说:“Too young too simple!离谱啊!!”
那正确的过程是怎么样的呢,我们继续往下看!
协议分析
====
我先给本文提到的英文单词,给上我的中文翻译,以防大家混淆:
-
client_random 客户端随机数
-
server_random 服务端随机数
-
pre_master_secret 预备主密钥
-
master_secret 主密钥
-
key_block 密钥块(有的文章把这个东西称为会话密钥)
先大致有个印象,继续往下阅读
现在我们已经有三个参数client_random,pre_master_secret,server_random,服务端和客户端分别会根据这三个参数,推导出master_secret,一旦master_secret被推导出来,会立刻删除pre_master_secret。(摘自rfc2246,section8.1)
当master_secret计算出以后,立刻计算key_block(摘自rfc2246,section6.3),这个密钥块,有的文章里又说他是会话密钥!计算公式如下,
key_block = PRF(master_secret,
“key expansion”,
server_random +
client_random)
如公式所示,PRF是一个Hash算法,如SHA256这些,具体用哪一个取决于TLS协议的版本!我们得到key_block后,可以基于到key_block继续推导出6个密钥值,分别是
-
client_write_MAC_key 客户端消息认证码密钥
-
server_write_MAC_key 服务端消息认证码密钥
-
client_write_key 客户端对称加密密钥
-
server_write_key 服务端对称加密密钥
-
client_write_IV 客户端初始化向量
-
server_write_IV 服务端初始化向量
整个过程用一张图来说明,注意了这六把密钥是根据key_block推导而出,也就是意味着这六把密钥是服务端和客户端共同持有的!
大家一定也发现了,你的密钥前都带有client或者server前缀,这代表密钥是服务端使用还是客户端使用!例如,客户端用client_write_key进行数据加密,发送数据,服务端收到消息后利用client_write_key进行解密。而后服务端使用server_write_key进行数据加密回复信息,客户端收到消息后用server_write_key解密服务端发来的信息!
OK,我们继续往下看!
现在我们已经有了6把密钥了,已经需要发送的消息data,那么加密流程具体怎么样的呢?
TLS一共有三种加密模式,流加密模式、分组模式、 AEAD 模式,我以流加密模式来进行说明,如下图所示
最后
总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习
还有更多学习笔记面试资料也分享如下:
知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习
还有更多学习笔记面试资料也分享如下:
[外链图片转存中…(img-1yCyn3Ft-1720101882343)]