SSL/TLS学习-ECDHE
1、RSA算法缺陷
上篇总结了TLS使用RSA握手,但是RSA秘钥协商算法的最大问题是不支持向前保密。因为客户端传递随机数(用于生成对称加密密钥的条件之一)给服务端时使用的是公钥加密的,服务端收到后,会使用私钥解密得到随机数。所以一旦服务端的私钥泄露了,过去被第三方截获的所有TLS通讯密文都会被破解。
为了解决这一问题,于是就有了DH秘钥协商算法。
2、DH算法
DH算法的核心数学思想是离散对数是离散+对数两个数学概念的组合。
指数运算
对数运算
其中x参数为对数,y参数是真数,函数曲线图这里就详细画出了。例如以2为底数 ,32的对数是5;64的对数是6。
对数的取值是可以连续的,而离散的对数取值是不能连续的。离散对数是在对数运输的基础上加了 模运算就是取余操作C语言中取余符号位 % ,用mod表示。
如果对于一个证书b和质数p的一个原根a可以找到一个唯一的指数i使得:
成立。那么指数 i 称为 b 的以 a 为底数的模 p 的离散对数。
可以看到,整个密钥协商过程中,小红和小明公开了 4 个信息:p、g、A、B,其中p、g 是算法的参数,A 和 B是公钥,⽽ a、b 是双⽅各⾃保管的私钥,⿊客⽆法获取这 2 个私钥,因此⿊客只能从公开的 p、g、A、B ⼊⼿,计算出离散对数(私钥)。
根据离散对数的原理,如果 p 是⼀个⼤数,在现有的计算机的计算能⼒是很难破解出 私钥 a、b的,破解不出私钥,也就⽆法计算出会话密钥,因此 DH 密钥交换是安全的。
根据离散对数的幂运算的交换律,可以推导出K1 = K2
3、ECDHE
因为DH算法的计算效率问题,后面出现了ECDHE秘钥协商算法,目前大多数网站使用的正是ECDHE密钥协商算法。
DHE算法,是DH算法的升级,即每次协商通信过程中,客户端和服务器双方私钥在每次秘钥交换通信时,都是随机生成的、临时的。这个方式也是DHE算法,E全称(ephemeral:临时性的)。
ECDHE算法是在HDE算法的基础上利用ECC椭圆曲线特性,可以用更少的计算量计算出公钥,以及最终的会话秘钥。具体算法过程比复杂(后续有机会补充)这里就不细说了。
4、ECDHE握手过程
ECDHE握手只是秘钥协商过改变了,握手过程还是4次握手:
区别在于使用ECDHE,在TLS第4次握手钱,客户端就已经发送了加密的HTTP数据了,而RSA握手过程,必须完成TLS四次握手才能传输应用数据。
4.1、TLS第一次握手
客户端⾸先会发⼀个「Client Hello」消息,消息⾥⾯有客户端使⽤的 TLS 版本号、⽀持的密码套件列表,以及⽣成的随机数(Client Random)。
4.2、TLS第二次握手
服务端收到客户端的「打招呼」,同样也要回礼,会返回「Server Hello」消息,消息⾯有服务器确认的 TLS 版本号,也给出了⼀个随机数(Server Random),然后从客户端的密码套件列表选择了⼀个合适的密码套件。
密码套件含义与RSA密码套件解读一致
「 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384」
密钥协商算法使⽤ ECDHE;
签名算法使⽤ RSA;
握⼿后的通信使⽤ AES 对称算法,密钥⻓度 256 位,分组模式是 GCM;
摘要算法使⽤ SHA384;
接着,服务端为了证明⾃⼰的身份,发送「Certificate」消息,会把证书也发给客户端。
证书发送完毕之后发会发送Server Key Exchange消息
这段数据告诉客户端:
选择了名为 named_curve 的椭圆曲线,选好了椭圆曲线相当于椭圆曲线基点 G 也定好了,这些都会公开给客户端;
⽣成随机数作为服务端椭圆曲线的私钥,保留到本地;
根据基点 G 和私钥计算出服务端的椭圆曲线公钥,这个会公开给客户端。
为了保证这个椭圆曲线的公钥不被第三方篡改,服务端使用RSA签名算法给服务的的椭圆曲线公钥做签名。
之后就是server hello done消息,服务端跟客户端表明:这些就是我提供的信息,打招呼完毕。
注意:TLS第二次握手报文包含的内容比较多。有时候一个报文包含所有载荷,有时各个载荷单独发送。
⾄此,TLS 两次握⼿就已经完成了,⽬前客户端和服务端通过明⽂共享了这⼏个信息:Client Random、Server Random 、使⽤的椭圆曲线、椭圆曲线基点 G、服务端椭圆曲线的公钥,这⼏个信息很重要,是后续⽣成会话密钥的材料。
4.3、TLS第三次握手
客户端收到了服务端的证书后,⾃然要校验证书是否合法,如果证书合法,那么服务端的身份就是没问题的。校验证书到过程,会⾛证书链逐级验证,确认证书的真实性,再⽤证书的公钥验证签名,这样就能确认服务端的身份了,确认⽆误后,就可以继续往下⾛。(与RSA一致验证过程可以看RSA篇)。
客户端会⽣成⼀个随机数作为客户端椭圆曲线的私钥,然后再根据服务端前⾯给的信息,⽣成客户端的椭圆曲线公钥,然后⽤「Client Key Exchange」消息发给服务端。
⾄此,双⽅都有对⽅的椭圆曲线公钥、⾃⼰的椭圆曲线私钥、椭圆曲线基点 G。于是,双⽅都就计算出点(x, y),其中 x 坐标值双⽅都是⼀样的,前⾯说 ECDHE 算法时候,说 x 是会话密钥,但实际应⽤中,x 还不是最终的会话密钥。
最终的会话密钥,就是⽤「客户端随机数 + 服务端随机数 + x(ECDHE 算法算出的共享密钥) 」三个材料⽣成的。
之后客户端会发送一个「Change Cipher Spec」消息,告诉服务端后续改⽤对称算法加密通信。
接着,客户端会发「Encrypted Handshake Message」消息,把之前发送的数据做⼀个摘要,再⽤对称密钥加密⼀下,让服务端做个验证,验证下本次⽣成的对称密钥是否可以正常使⽤。
4.4、TLS第四次握手
最后,服务端也会有⼀个同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双⽅都验证加密和解密没问题,那么握⼿正式完成。于是,就可以正常收发加密的 HTTP 请求和响应了。
SSL/TLS学习-ECDHE相关推荐
- openssl 学习之SSL/TLS
之前在微博上看到一个分享,关于HTTPS的,原文链接The First Few Milliseconds of an HTTPS Connection,加上最近也在学习openssl 的相关知识.所以 ...
- 9. PKI - 三种密钥交换算法详解(RSA DHE ECDHE)及他们在SSL/TLS协议中的应用
9. PKI - 三种密钥交换算法详解(RSA& DHE& ECDHE)及他们在SSL/TLS协议中的应用 RSA密钥交换算法 DHE密钥交换算法 ECDHE密钥交换算法 参考 密钥交 ...
- 邮件协议POP3/IMAP/SMTP学习总结 SSL/TLS介绍 常用邮箱服务器设置
邮箱协议介绍 首先,SMTP.POP和IMAP都是与邮件有关的协议.SMTP主要是负责传送邮件,而POP和IMAP是负责接收邮件. SMTP SMTP (Simple Mail Transfer Pr ...
- linux服务器抓包分析,抓包分析SSL/TLS连接建立过程总结
1.前言 最近在倒腾SSL方面的项目,之前只是虽然对SSL了解过,但是不够深入,正好有机会,认真学习一下.开始了解SSL的是从https开始的,自从百度支持https以后,如今全站https的趋势越来 ...
- 抓包分析SSL/TLS连接建立过程【总结】
1.前言 最近在倒腾SSL方面的项目,之前只是虽然对SSL了解过,但是不够深入,正好有机会,认真学习一下.开始了解SSL的是从https开始的,自从百度支持https以后,如今全站https的趋势越来 ...
- SSL/TLS连接建立过程
分析SSL/TLS连接建立过程 1.基本概念 SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层.SSL通过互相认证.使用数字 ...
- SSL/TLS 通信过程
转载请以链接形式标明出处: 本文出自:103style的博客 目录 Wireshark抓包 Client Hello Server Hello.Certificate.Server Key Excha ...
- 聊聊HTTPS和SSL/TLS协议
要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 1. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 2. 大致了解 HTTP 和 TCP 的关系(尤其是"短连接 ...
- 聊聊 HTTPS 和 SSL/TLS 协议
原文:http://www.techug.com/post/https-ssl-tls.html 要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 大致了解几个基本术语(HTTPS.S ...
最新文章
- 【c语言】蓝桥杯算法提高 时间转换
- Redis的安装及使用
- javascript +new Date()
- 近期有哪些值得读的QA论文?| 专题论文解读
- C# 代码生成器 amp; 网站架构设计
- linux发包密码,linux下网络发包工具(cp过来的)
- Java过滤器详细文档,简介,实例,应用
- (7)Node.js 全局函数
- 三七互娱上半年近九成营收来自手游 精品化优势凸显
- JAVA学习-JAVA实现一元二次方程求解
- 【报告分享】2020年中国5G经济报告--助力新时代高质量发展.pdf(附下载链接)...
- 实操指南|数据分析遇上餐饮业
- 目前电子计算机处于什么时代,目前,电子计算机处于哪大规模和超大规模集成电路时代。()...
- 二叉树的前序序列、中序序列、后序序列、层次序列
- concurrent.futures:线程池,让你更加高效、并发的处理任务
- 在250美元5天城市
- Web前端学习笔记(十一)---聚光灯效果
- android 表情的输入 Unicode实现表情展示 无需图片素材及相关解析
- 三种方法Python读取文件指定行,来看看你用过没?
- 锤子Smartisan系统杀后台,推送通知,闲鱼收不到消息或者延迟问题解决
热门文章
- 基于星云链的智能合约与Dapp(四)——编写并运行智能合约
- 我的世界怎么联机显示服务器,《我的世界》怎么联机 服务器联机指令大全
- 360剑灵洪门崛起服务器维护,剑灵洪门崛起————【维护】11月21日更新维护公告...
- 框架CAS实现SSO单点登录功能
- 论文封面 摘要 目录 正文 页眉设置不同
- Android实现隐藏导航栏
- 全世界都在劝退学Android的程序员
- 美丽乡村建设网站php源码_2020最新亲测php网址导航源码全开源-清爽收录导航网站源码...
- php之生成uuid和guid
- 44.(leaflet篇)leaflet暗色系地图样式地图(获取滤镜值)