HTTPS ECDHE 握手解析
HTTPS 常用的密钥交换算法 RSA
和 ECDHE
RSA: 传统 不具备前向安全性
ECDHE:具有前向安全 被广泛使用
离散对数
ECDHE密钥协商算法从DH算法演进过来
DH算法: 非对称加密算法 因此可以用于密钥交换 该算法的核心数学思想是离散对数
指数和对数互为反函数 指数是幂运算 对数是指数的逆运算
对数运算的取值是可以连续的 而离散对数的取值是不能连续的 因此取名 离散
离散对数是对数运算的基础上进行了模运算
取余
参数a 和 模板p 公开
b为真数 i为对数
知道对数可以用上面公式计算出真数
反过来知道真数很难推算出对数(DH算法的数学基础)
DH算法
- 确定模板和底数 用P G 代称
- 各自生成一个随机整数 作为私钥 a b
- 计算公钥 A = G ^ a ( mod P ) B = G ^ b ( mod P )
- B ^ a ( mod P ) -> K A ^ b ( mod P )->K
- K为对称加密密钥
根据离散对数原理 如果P是一个大数 在现有的计算机的计算能力 很难破解出私钥ab 无法计算出会话密钥 因此安全
DHE算法
- static DH 现在已经废弃
- DHE算法
static DH 算法中有一方的私钥是静态的
黑客可以根据暴力数据破解服务器私钥 计算出会话密钥 不具备前向安全性
因此 随机生成 E:ephemeral(临时性的)
优势:只破获一次通信过程的私钥 和其他通信过程没有关系 相互独立
前向安全
ECDHE算法
DHE算法 -> 大量乘法 -> 性能不佳 -> 出现ECDHE算法
ECDHE算法在DHE算法基础上 利用ECC椭圆曲线特性 减少计算量
- 双方事先确定好使用哪种椭圆曲线 曲线基点G
- 各生成随机数 私钥d 与基点G相乘得到 公钥Q=dG 目前公私钥为 Q1 d1 ;Q2 d2
- 交换各自公钥 计算点(x1,y1)=d1Q2 (x2,y2)=d2Q1
- 椭圆曲线上满足乘法交换和结合律 x 坐标一样 因此是共享密钥
ECDHE 握手过程
TLS第一次握手
Client Hello
- TLS版本号
- 支持的密码套件
- 随机数
TLS第二次握手
Server Hello
- 服务器确认的TLS版本
- 随机数
- 选择合适的密码套件
「 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384」
- 密钥协商算法使用 ECDHE;
- 签名算法使用 RSA;
- 握手后的通信使用 AES 对称算法,密钥长度 256 位,分组模式是 GCM;
- 摘要算法使用 SHA384;
证明身份发送Certificate
消息 发送证书
发送完证书之后 发送 Server Key Exchange消息
- 选择椭圆曲线
- 随机数 作为 私钥
- 计算出服务端公钥 公开给客户端
使用RSA签名算法 给服务端的椭圆曲线公钥做签名
Server Hello Done
目前共享的信息:
- Client Random
- Server Random
- 使用的椭圆曲线
- 椭圆曲线基点G
- 服务端椭圆曲线的公钥
TLS第三次握手
首先校验证书合法性 -> 证书链
客户端生成随机数作为私钥 生成客户端公钥
使用 Client Key Exchange
消息发送给服务端
至此双方计算之后 横坐标 相同 可以作为会话密钥
TLS:最终的会话密钥 是使用 客户端随机数 服务端随机数 ECDHE算法的共享密钥 生成
客户端发送 Change Cipher Spec
消息 告诉客户端之后采用对称加密算法通信
客户端发送Encrypted Handshake Messgae
消息进行摘要 用对称密钥加密一下 让服务端做验证 验证对称密钥是都可以正常使用
TLS第四次握手
- Change Cipher Spec
- Encrypted Handshake Messgae
- 如果双方验证加密解密没有问题 握手完成
- 可以正常收发加密的HTTP请求和响应了
- RSA密钥协商算法不支持前向保密 ECDHE密钥协商算法支持前向保密
- 使用RSA密钥协商算法 TLS完成四次握手才能进行数据传输
- ECDHE算法 客户端可以不用等服务端的最后一次TLS握手 可以提前发出加密的HTTP数据
- ECDHE TLS第二次握手中 出现服务端发送的 Server Key Exchange 消息
- RSA中没有