阮一峰写了一篇不错的文章介绍ssl的运行机制 http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
对于”为什么一定要用三个随机数,来生成会话密钥”,dog250解释恐怕有误。
首先,前两个随机数分别来自客户端和服务端,其目的是为了防止重放攻击,因此所有计算都要带上它俩,而非为了增加随机性。
退一步说,如果pms被猜到,引入前两个随机数来计算最终密钥也于事无补,因为握手阶段,协商的加密算法以及前两个随机数都是明文传递的,攻击者完全可以照图索骥推导出最终密钥。
答案应该是,本来可以让pms直接作为会话密钥,但pms可能在会话间重复(随机数嘛),且会话密钥需要常驻内存(增加了泄漏的风险)。一旦泄漏,使用该pms的所有会话都遭殃了。
因此ssl的采用如下结构,将会话密钥泄漏的影响面限制在单个会话:
pms -> ms(会话密钥)-> key(对称密钥)。
“->”表示带上前两个随机数,按一定规则进行一系列摘要运算,因此不可逆。
其中:
pms:pre master secret,会在使用过后立刻从内存中清除。(Pms should be deleted in memory. http://tools.ietf.org/html/rfc5246#section-8.1)
ms:master secret、会话密钥,会话的生命周期内常驻内存,并面向session。
key:最终的对称密钥,面向connection。
参考:http://www.cse.ohio-state.edu/~lai/651/8.SSL.ppt