TLS1.2 与 TLS1.3研究笔记

188 阅读6分钟

问答摘要

1) TLS 1.2 与 TLS 1.3 握手主要区别

  • 往返次数(延迟):
    • TLS 1.2:典型 2-RTT。
    • TLS 1.3:典型 1-RTT,合并多条握手消息,显著降延迟。
  • 密钥交换与算法:
    • TLS 1.2:支持 RSA 密钥传输、(EC)DHE 等;含大量遗留套件。
    • TLS 1.3:移除静态 RSA/旧套件,仅保留具有前向保密的 (EC)DHE;对称算法限定为 AEAD(如 AES-GCM、ChaCha20-Poly1305)。
  • 安全与简化:
    • 移除易错或弱项(如压缩、RC4、SHA-1 等)、重协商逻辑简化、握手消息更少,默认更安全。
  • 消息流变化:
    • ClientHello 内直接携带密钥分享(key_share)。
    • 服务器尽早发送证书与 Finished,减少往返。

2) TLS 1.3 如何实现 0-RTT(早期数据)

  • 前提:客户端持有与服务器的会话恢复材料(PSK/Session Ticket)。
  • 过程:客户端在 ClientHello 中携带 PSK 与 early_data 扩展,并用基于上次会话派生的“早期密钥”加密应用数据;服务器接受则直接处理,同时继续 1-RTT 完整握手。
  • 风险与限制:0-RTT 数据可被重放,且不具前向保密;建议仅用于幂等请求(例如 HTTP GET)。

3) ECDH 与比特币的关联

  • 共同基础:都基于椭圆曲线密码学(ECC),比特币使用曲线 secp256k1。
  • 用途不同:
    • 比特币链上主要用 ECDSA(签名/验签,保证交易真实性)。
    • ECDH 用于密钥协商(产生共享密钥,加密通信)。
  • 生态中的使用:链下/协议层(例如部分钱包间加密、隐私方案、闪电网络等)会用 ECDH 协商共享密钥,实现点对点保密通道或隐身地址派生等。

4) 缩写

  • ECDH:Elliptic Curve Diffie–Hellman(椭圆曲线 Diffie–Hellman 密钥交换)
  • ECC:Elliptic Curve Cryptography(椭圆曲线密码学)
  • 相关:ECDSA(Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法)

ECDH 原理详解

A. 背景与数学基础

  • 核心难题:椭圆曲线离散对数问题(ECDLP)。已知基点 G 与点 Q=dG,想从 Q 求 d 在计算上困难。
  • 曲线与群:
    • 定义在有限域 𝔽_p 上的椭圆曲线 E:y² = x³ + ax + b(判别式 Δ ≠ 0 保证非奇异)。
    • 有限点集(含无穷远点 𝒪)构成阿贝尔群,加法是几何“弦切法”,标量乘法 dG 表示重复加法。
  • 公共参数(domain parameters):
    • 素域模数 p,曲线系数 a、b,基点 G,基点阶 n(通常是大素数),余因子 h(#E(𝔽_p) = n·h)。
    • 实务上常选 h=1 的曲线以简化子群问题(secp256k1 的 h=1)。

B. 密钥对与共享秘密

  • 钥匙生成(任一参与方):
    • 私钥 d ∈ [1, n−1] 的均匀随机数。
    • 公钥 Q = dG(曲线点)。
  • 交换过程(Alice 与 Bob):
    • Alice:私钥 a、公钥 A=aG;Bob:私钥 b、公钥 B=bG。
    • 共享点 S 的计算:
      • Alice 计算 S = aB = a(bG) = (ab)G
      • Bob 计算 S = bA = b(aG) = (ab)G
    • 由于群交换律,双方得到相同的曲线点 S,称为共享秘密(严格来说是共享曲线点)。
  • 关键结论:观察者即使知道 A、B 也难以从中恢复 a 或 b,更无法计算 (ab)G,安全性基于 ECDLP 困难性。

C. 从曲线点到对称密钥:KDF

  • 直接把曲线点 S 作为对称密钥不安全/不规范。通常取其 x 坐标或经编码作为 KDF 输入。
  • 常见做法:使用 HKDF(如基于 SHA-256)
    • PRK = HKDF-Extract(salt, IKM = x(S) || context)
    • K = HKDF-Expand(PRK, info, L)
  • 上下文/标签用于区分用途、防止密钥重复使用。TLS 1.3 使用 HKDF 并定义明确标签、上下文绑定。

D. 安全性质与变体

  • 前向保密(PFS):
    • 若每次会话使用新的临时密钥对(Ephemeral ECDH,简称 ECDHE),则长期私钥泄露也无法解密过去会话。
    • 静态 ECDH(长期密钥复用)不具备前向保密。
  • 抗重放/认证:
    • 纯 ECDH 不提供“认证”,需要结合签名或认证密钥包装(例如 TLS 握手中由证书和握手 transcript 绑定完成实体认证)。
  • 曲线选择:
    • 常见:secp256r1(P-256,NIST)、secp256k1(比特币)、X25519/X448(Montgomery 曲线,RFC 7748,工程上更易做常数时间实现)。
  • 安全强度:
    • 约略等效:256-bit 曲线私钥 ≈ 128-bit 对称安全强度(例如 P-256、secp256k1)。

E. 实现要点与常见陷阱

  • 公钥验证(至关重要):
    • 检查公钥不是无穷远点 𝒪;
    • 点在曲线上:满足曲线方程;
    • 子群检查/余因子清除:避免小子群攻击(h>1 的曲线尤需注意;secp256k1 的 h=1 更简单)。
  • 常数时间防侧信道:
    • 标量乘法采用常数时间算法(如 Montgomery ladder / 固定窗口),避免时序/功耗泄露。
  • 随机性质量:
    • 私钥/临时密钥必须使用强随机;
    • 绝不可复用临时密钥(会破坏前向保密,甚至泄露长期密钥)。
  • 点压缩与编码:
    • SEC1 定义的未压缩/压缩格式;解析时必须严格校验,防“无效曲线”攻击。
  • KDF 与密钥区分:
    • 不同用途应使用不同“info/label/context”,做到密钥分离。

F. 与协议/系统的衔接

  • TLS 1.3:
    • 使用 ECDHE(即 ECDH 的“临时密钥”变体)作为默认密钥协商机制;
    • 客户端在 ClientHello 通过 key_share 发送公钥;服务器回传对应公钥;双方用 HKDF 从共享点派生握手密钥、应用密钥。
  • 比特币/加密货币生态:
    • 链上签名:使用 ECDSA(同曲线基础,不是密钥交换)。
    • 链下/隐私方案:钱包间可用(secp256k1 上的)ECDH 派生共享密钥,用于加密消息、派生一次性地址(如隐身地址/部分付款码方案等)。
    • 闪电网络等二层协议:建立加密通道时采用基于 ECDH 的密钥协商(具体实现依协议套件,常与 Noise/HKDF 组合)。

G. 直观小示例(伪代码)

# 域参数:secp256k1 (p, a, b, G, n, h=1)

# Alice 生成
a = RandomInt(1, n-1)
A = ScalarMult(a, G)   # 公钥

# Bob 生成
b = RandomInt(1, n-1)
B = ScalarMult(b, G)   # 公钥

# 交换 A, B(公开可见)

# 计算共享点
S_A = ScalarMult(a, B) # Alice 侧:a * B = (ab)G
S_B = ScalarMult(b, A) # Bob 侧:b * A = (ab)G

assert S_A == S_B

# 提取 x 坐标作为 KDF 输入
ikm = XCoord(S_A) || context

# 使用 HKDF-SHA256 派生对称密钥(长度 L)
prk = HKDF-Extract(salt, ikm)
K   = HKDF-Expand(prk, info, L)

要点:

  • 公开交换仅为曲线点公钥 A、B;
  • 真正用于对称加密的并非曲线点本身,而是经 KDF 派生出的密钥材料;
  • 在认证场景(如 TLS)中,握手会将身份、参数、transcript 一并绑定,防中间人攻击。

H. 简短“为何可行”的数学直觉

  • 群交换性保证 a(bG) = b(aG);
  • 对攻击者而言,从 G、A=aG、B=bG 推出 (ab)G 的有效方法等价于解决 ECDLP(当前被认为计算上不可行);
  • 因此,双方可公开交换公钥而不泄露共享秘密。

术语速查

  • ECC:Elliptic Curve Cryptography(椭圆曲线密码学)
  • ECDH:Elliptic Curve Diffie–Hellman(椭圆曲线密钥交换)
  • ECDHE:Ephemeral ECDH(临时密钥的 ECDH,具前向保密)
  • ECDSA:Elliptic Curve Digital Signature Algorithm(椭圆曲线数字签名)
  • KDF:Key Derivation Function(密钥派生函数)
  • HKDF:HMAC-based KDF(常见标准化 KDF,TLS 1.3 采用)
  • ECDLP:Elliptic Curve Discrete Logarithm Problem(椭圆曲线离散对数问题)