网络2️⃣HTTPS-密钥交换算法

SSL/TLS

HTTPS 是在 TCPHTTP 之间添加 SSL/TLS 安全协议

解决 HTTP 的安全性问题。

  • 在 HTTP 中,通信之前需要进行 TLS 握手。
  • 密钥交换算法:不同密钥交换算法的 TLS 握手流程不同。
    • TLS/1.2:采用 RSA 和 DH。
    • TLS/1.3:采用 ECDHE。

RSA 握手

四次握手

  • Wireshark 抓包

  • 示意图

第一次握手

Client Hello

Client Hello:客户端向服务器发起加密通信请求。

  1. 客户端随机数(用于生成会话密钥)

  2. 客户端支持的 TLS 版本(e.g. TLS/1.2)

  3. 客户端支持的密码套件列表(e.g. RSA)

第二次握手

Server Hello

Sever Hello:服务器收到客户端请求后,发出响应。

  1. 服务器随机数(用于生成会话密钥)

  2. 服务端确认 TLS 版本

  3. 服务端确认密码套件列表

密码套件格式

TLS_密钥交换算法_签名算法_WITH_对称加密算法_摘要算法

示例:TLS_RSA_WITH_AES_128_GCM_SHA256

  • TLS
  • RSA:本来 WITH 前有 2 个单词,此处代表密钥交换算法和签名算法都是 RSA。
  • WITH
  • AES_128_GCM:握手后通信采用 AES 作为对称加密算法,密钥长度 128 位,分组模式是 GCM。
  • SHA256:摘要算法,用于消息认证和产生随机数。

Certificate

Server Certificate:服务器的数字证书。

Server Hello Done

Server Hello Done:代表 Server 第一次响应结束。

客户端校验证书

客户端拿到了服务端的数字证书后,需要校验数字证书的真实性。

数字证书和 CA

数字证书:用于认证公钥持有者的身份,防止第三方冒充。

i.e. 告诉客户端,该服务端身份是否可信。

数字证书的本质是文件,包含以下信息。

  • 公钥
  • 持有者信息
  • CA 信息
  • CA 数字签名及使用的算法
  • 证书有效期
  • 其它信息

数字证书认证机构Certificate Authority)

  • 网络中具有极高可信度的公证中心。
  • CA 拥有一对公钥和私钥。
    • CA 私钥保密,用于对服务器公钥加密生成数字签名。
    • CA 公钥已预先内置到浏览器或操作系统中,用于验证签名真实性。

数字证书签发和验证

CA 签发证书

  • 服务器公钥、用途、颁发者、有效时间等信息打包,进行哈希计算得到一个 Hash 值。
  • 使用 CA 私钥对 Hash 值加密,生成 CA 数字签名
  • CA 数字签名 添加在文件证书上,形成数字证书。

客户端

  1. 使用相同的哈希算法,计算服务器数字证书信息的 Hash 值(H1)。

  2. 使用 CA 公钥对服务器数字证书中的数字签名解密(得到 H2)。

  3. 对比 H1 和 H2,相同说明证书是由 CA 真实提供的,否则说明是伪造的。

  4. 数字证书中获取服务器公钥,使用它对报文进行加密发送。

第三次握手

客户端验证证书可信后,准备第三次握手。

Client Key Exchange

Client Key Exchange:发送预主密钥(pre-master

  1. 生成随机数(预主密钥,用于生成会话密钥)。

  2. 使用服务器公钥加密后发出。

生成会话密钥Master Secret):

用于后续 HTTP 通信的对称加密。

  • 客户端:根据双方协商的算法,结合三个随机数生成本次通信的会话密钥
  • 服务器:收到客户端发送的预主密钥后(使用服务器私钥解密),同理得到一个相同的会话密钥

Change Cipher Spec

Change Cipher Spec:通知服务器,之后使用会话密钥进行加密通信。

Finished

Finished(Encrypted Handshake Message):客户端握手结束

  • 将之前所有内容发生的数据生成一个摘要,使用会话密钥加密后发出。

  • 用于服务端校验,验证加密通信是否可用、握手信息是否有被中途篡改过。

第四次握手

Change Cipher Spec

Change Cipher Spec:之后使用会话密钥进行加密通信。

Finished

Finished(Encrypted Handshake Message):服务端握手结束

  • 将之前所有内容发生的数据生成一个摘要,使用会话密钥加密后发出。
  • 用于客户端校验

客户端校验通过后,握手正式完成。

之后采用会话密钥进行对称加密通信。

RSA 缺陷 - 前向保密

RSA 不支持前向保密(aka. 前向安全)

  • 客户端传递的预主密钥(pre-master)是用服务器公钥加密的。
  • 如果服务器私钥泄漏,过去被第三方截获的 TLS 通信密文都会被破解。

ECDHE 握手

算法说明

ECDHE 由 DH 演进而来。

DH 是非对称加密算法,可用于密钥交换。

离散对数

DH 算法的核心数学思想是离散对数对数运算 + 模运算

  • 参数:根据以下参数,可以计算出真数 b。

    • 公共参数:底数 a,模数 p

    • 私有参数:离散对数 i

  • 反之,很难通过公共参数和真数来反推离散对数(尤其是 p 很大时)。

DH 算法

假设主机 A 和主机 B 通信,约定使用 DH 来交换密钥。

  1. 确定公共参数:双方确定底数 G 和模数 P。
  2. 随机生成私钥:双方各自生成一个随机整数作为私钥,分别用 a 和 b 代称。
  3. 计算公钥:根据公共参数和私钥生成,各自生成公钥。
    • 主机 A 公钥 = Ga % P
    • 主机 B 公钥 = Gb % P
  4. 交换公钥:此时双方都有公共参数(P, G)、双方公钥(A, B)和各自的私钥(a/b)
  5. 计算会话密钥:用对方的公钥作为底数,各自的私钥作为离散对数,对相同的模数计算得到相同密钥值。
    • 主机 A:Ba % P = Gab % P = K
    • 主机 B:Ab % P = Gba % P = K

DHE 算法

根据私钥生成的方式,DH 算法分为两种实现。

  • static DH(已废弃):不具备前向安全性
    • 每次密钥交换时有一方的私钥是静态的。通常是服务器私钥固定,客户端私钥随机生成。
    • 随着时间延长,黑客截获海量的密钥协商过程的数据,暴力破解出服务器私钥,从而计算出会话密钥,破解过去的通信密文。
  • DHE(常用):Ephemeral 临时性的。
    • 每次密钥交换时双方的密钥都是随机生成的。
    • 每次通信过程的私钥不同,保证了前向安全
    • 缺点:需要做大量乘法运算,性能差。

ECDHE 算法 🔥

ECDHE:DHE 算法 + ECC 椭圆曲线特性。

使用更少的计算量来计算公钥和会话密钥。

交互流程

  1. 确定公共参数:双方事先确定椭圆曲线和曲线上的基点 G
  2. 随机生成私钥,计算公钥:双方各自生成一个随机数作为私钥(记 d),计算公钥(记 Q = dG)
    • 主机 A 的公私钥:Q1, d1
    • 主机 B 的公私钥:Q2, d2
  3. 交换公钥:此时双方都有公共参数(椭圆曲线,G)、双方公钥(Q1, Q2)和各自的私钥(d1/d2)
  4. 计算共享密钥:用对方的公钥 + 各自的私钥,得到相同的 x 坐标。
    • 主机 A:计算点 (x1, y1) = d1Q2 = d1d2G
    • 主机 B:计算点 (x2,y2) = d2Q1 = d2d1G

关于椭圆曲线的运算 👉 技术蛋老师:ECC椭圆曲线加密算法原理

ECDHE 握手过程

四次握手

  • ECDHE 第三次握手时就发送了加密数据,而不需要等到四次握手结束(RSA 需要)。
  • 因此,ECDHE 比 RSA 握手过程节省了一个 RTT(aka. TLS False Start)。

第一次握手

Client Hello

同 RSA

  • 客户端随机数

  • 客户端支持的 TLS 版本

  • 客户端支持的密码套件列表

第二次握手 🔥

Server Hello

与 RSA 区别在于,密码套件不同。

  • 服务器随机数

  • 服务端确认 TLS 版本

  • 服务端确认密码套件列表

密码套件:相比 RSA,密钥交换算法改成了 ECDHE

示例:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

  • TLS
  • ECDHE:密钥交换算法
  • RSA:签名算法
  • WITH
  • AES_256_GCM:握手后通信采用 AES 作为对称加密算法,密钥长度 256 位,分组模式是 GCM。
  • SHA384:摘要算法,用于消息认证和产生随机数。

Certificate

发送服务器的数字证书

Server Key Exchange 🔥

RSA 中没有这一步

  1. 确认椭圆曲线和基点 G(对客户端公开)

  2. 生成私钥:生成随机数作为服务端椭圆曲线的私钥。

  3. 计算公钥

    • 根据基点 G 和私钥,计算服务端的椭圆曲线公钥(对客户端公开)。
    • 为了防止公钥被篡改,会用 RSA 算法做个签名。
  4. 发送上述的公开信息。

Server Hello Done

代表 Server 第一次响应结束。

第三次握手

客户端收到服务端的证书后,需要进行校验。

验证其可信性后,准备第三次握手。

Client Key Exchange 🔥

  • 生成私钥:生成随机数作为客户端椭圆曲线的私钥。
  • 计算公钥:根据基点 G 和私钥,计算客户端的椭圆曲线公钥。
  • 发送公钥

至此:客户端和服务端都有双方公钥、各自私钥、椭圆曲线和基点 G

根据 ECDHE 原理计算点 (x, y),其中 x 坐标值相同(共享密钥)。

计算会话密钥客户端随机数 + 服务端随机数 + 共享密钥 x,三个材料而成。

Change Cipher Spec

通知服务端,之后使用会话密钥进行对称加密通信。

Finishied

客户端握手结束

将之前发送的数据做一个摘要,使用会话对称密钥加密后发出(用于服务端校验)。

第四次握手

Change Cipher Spec

之后使用会话密钥进行对称加密通信。

Finishied

服务端握手结束

将之前所有内容发生的数据生成一个摘要,使用会话密钥加密后发出(用于客户端校验

客户端校验通过后,握手正式完成。之后采用会话密钥进行对称加密通信。

posted @ 2023-07-08 16:29  Jaywee  阅读(436)  评论(0编辑  收藏  举报

👇