总结
面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。
以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考
-
(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 模式,我以流加密模式来进行说明,如下图所示
我们现在来看上面的第二步,利用write_mac_key对数据加密,加上MAC验证码,利用MAC码来保证完整性。
那么,这个MAC验证码的生成公式又是怎么样的呢?
MAC验证码
======
总结
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
(https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**