跳转至

ECDHE握手解析

ECDHE

HTTPS常用的密钥交换算法:RSA算法ECDHE算法

  • RSA算法:不具备前向安全性。一旦服务端的私钥被泄漏,则后续的加密过程都会被破解

  • ECDHE算法:前身是DH算法

  • DH算法:

    客户端和服务端各自生成随机数作为私钥,利用DH算法算出各自的公钥,通过TLS握手交换双方的公钥,然后双方根据各自拥有的对方的公钥和自己的私钥和算法算出一个随机数,此随机数双方都是一样的,以此作为后续加密通信的密钥

  • DH因为效率的问题,后续渐渐被替代

握手解析

离散对数

  • 离散+对数:离散对数是在对数运算的基础上加了模运算(取余数):

a ^ i (mod p) = b

  • 底数a和模数p是公共参数,i 是对数,b 是真数(上述公式转换成对数)

  • 当p特别大的时候,知道 a 和 b 的情况下,很难算出对数 i

DH算法

  • A:P为模数,G为底数
  • B:P为模数,G为底数
  • A和B各自生成私钥,A的私钥:a;B的私钥:b;
  • A的公钥:A=G^a(mod P);
  • B的公钥:B=G^b(mod P);
  • A和B公开。从真数得到对数很难
  • A拥有的:P、G、a、A、B;B拥有的:P、G、b、A、B
  • A:B^a(mod P)=K=(G^b(mod P))^a(mod P)=(G^a(mod P))^b(mod P);
  • B:A^b(mod P)=(G^a(mod P))^b(mod P)=K;

DHE算法

私钥生成方式:

  • static DH算法(已废弃)

  • 只有客户端的公钥是变化的,服务端私钥不变

  • 不具备前向安全性

  • DHE算法,常用

  • E:临时性的。私钥变化

  • 前向安全

ECDHE

ECDHE算法是在DHE算法的基础上利用ECC椭圆曲线特性

  • 双方确定好用哪种椭圆曲线以及确定基点G,参数公开
  • 生成随机数作为私钥d,得到:公钥Q:Q=dG
  • A:Q1=d1G;B:Q2=d2G
  • A、B交换各自的公钥。A:(x1,x2)=d1Q2;B:(x2,y2)=d2Q1;
  • d1Q2=d1d2G=d2Q1,x坐标相同,也就是会话密钥
  • 双方的私钥都是随机的、临时的、不公开的
  • 安全

握手过程

TLS第一次握手

  • Client Hello:TLS版本号、支持的密码套件列表、随机数

TLS第二次握手

  • 收到招呼
  • Server Hello:确认TLS版本、选择合适的密码套件、随机数
  • Certificate:数字证书
  • Server Key Exchange
  • name_curve:椭圆曲线(基点G也选好了)
  • 生成随机数作为服务端椭圆曲线私钥,保留本地
  • 基点G + 私钥 = 服务端的公钥
  • RSA签名算法给上述公钥签名
  • Server Hello Done:招呼打完

TLS第三次握手

  • 客户端收到来自服务端的消息,检验证书
  • 生成随机数作为客户端的私钥
  • 根据服务端前面给的信息,生成客户端的公钥
  • Client Key Exchange

双方计算出x坐标,x是会话密钥 = 客户端生成的随机数 + 服务端随机数 + x

三个伪随机数混合,随机性升高

  • Change Cipher Spec:告诉服务器后续改用对称加密算法通信
  • Encrypted Handshake Message:把之前的消息做个摘要,再用对称加密加密,让服务端做个验证

TLS第四次握手

  • 服务端也是同样的操作。发送Change Cipher SpecEncrypted Handshake Message消息,双方验证没问题,及后续HTTP请求响应都是上面对称加密通信

总结

RSA 和 ECDHE 握手过程的区别:

  • RSA密钥协商算法不支持前向保密,ECDHE支持前向保密
  • RSA:TLS四次握手结束后才能进行应用数据传输;ECDHE:客户端可以不用等服务端最后一次握手,就可以提前发出加密的HTTP数据,节省了一个消息往返时间
  • ECDHE:在TLS第二次握手中,服务端发出Server Key Exchange消息,而RSA握手过程没有该消息