HTTPS 握手过程与加密算法详解

HTTPS 握手过程与加密算法详解

一、思维导图:HTTPS 握手与加密算法

arduino 复制代码
HTTPS 握手与加密算法
├── HTTPS 概述
│   ├── 定义:HTTP over SSL/TLS
│   ├── 作用:数据加密、身份验证、数据完整性
│   └── 与 HTTP 的区别
├── TLS/SSL 协议
│   ├── 协议层级:记录层、握手层、密钥交换层
│   ├── 版本:SSLv2、SSLv3、TLS 1.0、TLS 1.1、TLS 1.2、TLS 1.3
│   └── 核心功能:加密、认证、完整性
├── HTTPS 握手过程
│   ├── 阶段 1:Client Hello
│   │   ├── 客户端支持的 TLS 版本
│   │   ├── 随机数(Client Random)
│   │   ├── 支持的加密套件(Cipher Suites)
│   │   └── 扩展字段(SNI、ALPN 等)
│   ├── 阶段 2:Server Hello
│   │   ├── 服务器选择的 TLS 版本
│   │   ├── 随机数(Server Random)
│   │   ├── 选定的加密套件
│   │   └── 服务器证书(含公钥)
│   ├── 阶段 3:证书验证
│   │   ├── 客户端验证服务器证书
│   │   ├── CA 签名验证
│   │   └── 证书链完整性
│   ├── 阶段 4:密钥交换
│   │   ├── 方式:RSA、DH、ECDH
│   │   ├── 预主密钥(Pre-Master Secret)
│   │   ├── 主密钥(Master Secret)
│   │   └── 会话密钥(Session Key)
│   ├── 阶段 5:加密通信
│   │   ├── 对称加密开始
│   │   ├── 数据加密与完整性校验
│   │   └── 握手完成(Finished 消息)
├── 加密算法详解
│   ├── 对称加密
│   │   ├── 定义:同一密钥加密解密
│   │   ├── 常见算法
│   │   │   ├── AES(高级加密标准)
│   │   │   │   ├── 模式:CBC、GCM
│   │   │   │   ├── 密钥长度:128、192、256 位
│   │   │   │   └── 应用场景
│   │   │   ├── DES(数据加密标准)
│   │   │   │   ├── 56 位密钥
│   │   │   │   └── 已废弃
│   │   │   └── 3DES
│   │   │       ├── 三次 DES 加密
│   │   │       └── 性能较低
│   │   └── 优缺点
│   ├── 非对称加密
│   │   ├── 定义:公钥加密,私钥解密
│   │   ├── 常见算法
│   │   │   ├── RSA
│   │   │   │   ├── 基于大整数分解
│   │   │   │   ├── 密钥长度:2048、4096 位
│   │   │   │   └── 性能较慢
│   │   │   ├── ECC(椭圆曲线加密)
│   │   │   │   ├── 基于椭圆曲线离散对数
│   │   │   │   ├── 密钥长度:256 位
│   │   │   │   └── 性能高效
│   │   │   └── DSA(数字签名算法)
│   │   │       ├── 仅用于签名
│   │   │       └── 不用于加密
│   │   └── 优缺点
│   ├── 密钥交换算法
│   │   ├── DH(Diffie-Hellman)
│   │   │   ├── 基于离散对数
│   │   │   └── 不传递密钥
│   │   ├── ECDH(椭圆曲线 DH)
│   │   │   ├── 更高效
│   │   │   └── 现代 TLS 主流
│   │   └── 前向保密(PFS)
│   ├── 哈希算法
│   │   ├── 定义:数据完整性校验
│   │   ├── 常见算法
│   │   │   ├── MD5(已废弃)
│   │   │   ├── SHA-1(已不安全)
│   │   │   ├── SHA-256
│   │   │   └── SHA-3
│   │   └── HMAC(基于哈希的消息认证码)
│   └── 混合加密
│       ├── 对称 + 非对称结合
│       ├── TLS 中的应用
│       └── 性能与安全平衡
├── 常见问题与优化
│   ├── 握手性能优化
│   │   ├── 会话复用(Session Resumption)
│   │   ├── TLS 1.3 零往返(0-RTT)
│   │   └── 加密算法选择
│   ├── 安全问题
│   │   ├── 中间人攻击(MITM)
│   │   ├── 证书伪造
│   │   └── 弱加密算法风险
│   └── 调试工具
│       ├── Wireshark
│       ├── OpenSSL
│       └── ssllabs.com
└── 总结
    ├── HTTPS 的重要性
    ├── 加密算法的选择
    └── 未来趋势:TLS 1.3 普及

二、HTTPS 概述

HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 协议的安全版本,通过在 HTTP 和 TCP 之间引入 TLS/SSL 协议(Transport Layer Security / Secure Sockets Layer)实现数据加密、身份验证和数据完整性保护。与 HTTP 不同,HTTPS 确保数据在客户端(如浏览器)和服务器之间传输时不被窃听、篡改,并验证通信双方的身份。

HTTPS 的核心功能

  1. 数据加密:防止第三方窃听通信内容。
  2. 身份验证:通过数字证书验证服务器身份,防止中间人攻击。
  3. 数据完整性:通过消息完整性校验(如 HMAC)确保数据未被篡改。

TLS/SSL 协议

TLS 是 SSL 的升级版,目前主流版本为 TLS 1.2 和 TLS 1.3。TLS 协议分为记录层(负责数据分片、加密、完整性校验)和握手层(负责协商加密参数、密钥交换)。

三、HTTPS 握手过程详解

HTTPS 握手是 TLS 协议的核心,用于在客户端和服务器之间协商加密参数、交换密钥,并建立安全通信通道。以下是详细的握手过程,基于 TLS 1.2(TLS 1.3 稍有不同,后续会补充)。

1. Client Hello

客户端(如浏览器)发起握手,向服务器发送 Client Hello 消息,包含:

  • TLS 版本:客户端支持的最高 TLS 版本(如 TLS 1.2 或 1.3)。
  • 随机数(Client Random):32 字节随机数,用于后续密钥生成。
  • 加密套件(Cipher Suites) :客户端支持的加密算法组合,例如 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,其中:
    • ECDHE:密钥交换算法(椭圆曲线 Diffie-Hellman)。
    • RSA:认证算法。
    • AES_256_GCM:对称加密算法(256 位 AES,GCM 模式)。
    • SHA384:哈希算法。
  • 扩展字段
    • SNI(Server Name Indication):指定目标域名,便于服务器选择正确证书。
    • ALPN(Application-Layer Protocol Negotiation):协商应用层协议(如 HTTP/2)。

2. Server Hello

服务器响应 Server Hello 消息,选择双方支持的加密参数:

  • TLS 版本:确认使用的 TLS 版本。
  • 随机数(Server Random):服务器生成的 32 字节随机数。
  • 加密套件:从客户端提供的套件中选择一个。
  • 服务器证书:包含服务器的公钥和 CA(证书颁发机构)签名。

3. 证书验证

客户端收到服务器证书后,执行以下验证:

  1. 证书链完整性:检查证书是否由受信任的 CA 签名,追溯至根 CA。
  2. 域名匹配:验证证书中的域名与请求的域名一致。
  3. 有效期:检查证书是否在有效期内。
  4. 吊销状态:通过 CRL(证书吊销列表)或 OCSP(在线证书状态协议)确认证书未被吊销。

如果验证失败,客户端会终止连接并提示用户(如"证书不受信任")。

4. 密钥交换

密钥交换是 HTTPS 握手的核心,用于生成安全的会话密钥。以下是两种常见方式:

(1)RSA 密钥交换(较老,已被淘汰)
  • 客户端生成一个 预主密钥(Pre-Master Secret),用服务器的公钥加密后发送。
  • 服务器用私钥解密得到预主密钥。
  • 双方使用 Client Random、Server Random 和预主密钥,通过伪随机函数(PRF)生成 主密钥(Master Secret)
  • 主密钥再派生出 会话密钥(Session Key),用于后续的对称加密。

问题:RSA 密钥交换不支持前向保密(PFS)。如果服务器私钥泄露,历史通信可被解密。

(2)DH/ECDH 密钥交换(现代主流)
  • DH(Diffie-Hellman):基于离散对数问题,客户端和服务器各生成一对公钥和私钥,交换公钥后计算共享密钥。
  • ECDH(椭圆曲线 DH):基于椭圆曲线离散对数问题,效率更高,现代 TLS 主流。
  • 过程:
    1. 客户端生成 ECDH 公钥(基于椭圆曲线参数),发送给服务器。
    2. 服务器生成自己的 ECDH 公钥,发送给客户端。
    3. 双方使用各自的私钥和对方的公钥,计算相同的 预主密钥
    4. 结合 Client Random 和 Server Random,生成主密钥和会话密钥。

优点:支持前向保密。即使服务器私钥泄露,历史会话密钥无法被破解。

5. 加密通信

握手完成后,双方使用协商好的会话密钥进行对称加密通信:

  • 对称加密:通常使用 AES(高级加密标准)算法。
  • 完整性校验:通过 HMAC(基于 SHA-256 等哈希算法)验证数据未被篡改。
  • Finished 消息:双方发送握手完成消息,确认握手成功。

TLS 1.3 的改进

TLS 1.3 优化了握手过程,提高了性能和安全性:

  1. 减少往返:支持 1-RTT(一次往返)握手,甚至 0-RTT(零往返,基于会话复用)。
  2. 强制前向保密:移除 RSA 密钥交换,仅支持 DH/ECDH。
  3. 简化加密套件:移除不安全的算法(如 MD5、SHA-1)。
  4. 加密所有握手消息:除初始 Client Hello 外,所有消息均加密。

四、加密算法详解

HTTPS 使用混合加密机制,结合对称加密、非对称加密、密钥交换算法和哈希算法,以平衡安全性和性能。以下是对各种加密算法的详细讲解,特别针对您提到的"对加密算法没有认知"的情况,我会从基础开始,逐步深入。

1. 对称加密

定义:使用同一密钥进行加密和解密,速度快,适合加密大量数据。

常见算法
  • AES(Advanced Encryption Standard)

    • 概述:2001 年成为 NIST 标准,取代 DES,是目前最广泛使用的对称加密算法。
    • 密钥长度:128 位、192 位、256 位(AES-128、AES-192、AES-256)。
    • 模式
      • CBC(Cipher Block Chaining):将明文分块,每块与前一块密文异或后加密,需初始化向量(IV)。
      • GCM(Galois/Counter Mode):结合加密和完整性校验,现代 TLS 主流。
    • 优点:高效、安全,硬件加速支持广泛。
    • 应用:TLS 数据加密、磁盘加密(如 BitLocker)。
  • DES(Data Encryption Standard)

    • 概述:1977 年发布,56 位密钥,块大小 64 位。
    • 问题:密钥太短,易被暴力破解,已被淘汰。
    • 应用:仅在遗留系统中使用。
  • 3DES(Triple DES)

    • 概述:对 DES 进行三次加密,密钥长度 168 位(实际安全强度约 112 位)。
    • 问题:性能差,安全性低于 AES,已逐渐淘汰。
    • 应用:银行系统中的过渡方案。
优缺点
  • 优点:速度快,适合加密大数据量。
  • 缺点:密钥分发困难,需安全通道传输密钥。

2. 非对称加密

定义:使用一对密钥(公钥和私钥),公钥加密,私钥解密,或反之用于签名。安全性高,但速度慢。

常见算法
  • RSA(Rivest-Shamir-Adleman)

    • 原理:基于大整数分解难题,公钥和私钥由两个大素数的乘积生成。
    • 密钥长度:现代推荐 2048 位或 4096 位。
    • 用途:密钥交换(老版本 TLS)、数字签名。
    • 缺点:计算复杂度高,性能较差。
    • 应用:证书签名、早期 TLS 密钥交换。
  • ECC(Elliptic Curve Cryptography)

    • 原理:基于椭圆曲线上的离散对数难题。
    • 密钥长度:256 位 ECC 安全性相当于 3072 位 RSA。
    • 优点:计算效率高,密钥短,适合移动设备。
    • 应用:TLS 1.3 的 ECDH 密钥交换、ECDSA 签名。
  • DSA(Digital Signature Algorithm)

    • 原理:基于离散对数问题,仅用于数字签名,不支持加密。
    • 应用:证书签名(较少使用)。
    • 缺点:性能低于 ECC。
优缺点
  • 优点:无需安全通道分发密钥,适合身份验证和密钥交换。
  • 缺点:计算复杂,速度慢,不适合加密大数据。

3. 密钥交换算法

定义:用于安全地协商会话密钥,解决对称加密的密钥分发问题。

常见算法
  • DH(Diffie-Hellman)

    • 原理:基于离散对数问题,双方交换公钥,计算共享密钥。
    • 过程
      1. 双方约定公开参数(素数 p 和生成元 g)。
      2. 各生成私钥(a、b)和公钥(g^a mod p、g^b mod p)。
      3. 交换公钥,计算共享密钥(g^(ab) mod p)。
    • 优点:支持前向保密。
    • 缺点:计算复杂度较高。
  • ECDH(Elliptic Curve Diffie-Hellman)

    • 原理:DH 的椭圆曲线版本,使用椭圆曲线点运算。
    • 优点:效率高,密钥短,TLS 1.3 主流。
    • 应用:现代 HTTPS 握手中的密钥交换。
前向保密(PFS)
  • 定义:即使长期私钥泄露,历史会话密钥仍安全。
  • 实现:通过临时密钥(如 DH/ECDH)生成会话密钥,每次握手独立。
  • 重要性:TLS 1.3 强制要求 PFS。

4. 哈希算法

定义:将任意长度的数据映射为固定长度的值,用于完整性校验和消息认证。

常见算法
  • MD5

    • 概述:128 位输出,1992 年发布。
    • 问题:存在碰撞漏洞,已被淘汰。
    • 应用:仅用于非安全场景(如校验和)。
  • SHA-1

    • 概述:160 位输出,1995 年发布。
    • 问题:碰撞攻击可行,已不安全。
    • 应用:遗留系统,逐渐被禁用。
  • SHA-256

    • 概述:SHA-2 家族,256 位输出,安全性高。
    • 应用:TLS 1.2/1.3 的 HMAC、证书签名。
    • 优点:抗碰撞,广泛支持。
  • SHA-3

    • 概述:基于 Keccak 算法,2015 年发布。
    • 优点:与 SHA-2 不同原理,备用方案。
    • 应用:新兴场景,尚未广泛普及。
HMAC(Hash-based Message Authentication Code)
  • 定义:结合哈希算法和密钥,生成消息认证码。
  • 应用:TLS 中的数据完整性校验。

5. 混合加密

定义:结合对称加密和非对称加密,兼顾安全性和性能。

  • 过程
    1. 使用非对称加密(如 RSA 或 ECDH)协商对称加密的会话密钥。
    2. 使用对称加密(如 AES)加密通信数据。
  • TLS 中的应用
    • 握手阶段:非对称加密用于密钥交换和认证。
    • 数据传输阶段:对称加密用于加密通信内容。
  • 优点:非对称加密解决密钥分发问题,对称加密保证高效传输。

五、常见问题与优化

1. 握手性能优化

  • 会话复用
    • Session ID:客户端和服务器缓存会话参数,复用主密钥。
    • Session Ticket:服务器加密会话状态发送给客户端,客户端下次连接时携带。
  • TLS 1.3 0-RTT:客户端在初次握手后缓存密钥,首次连接即可发送加密数据。
  • 选择高效算法:优先使用 ECDH 和 AES-GCM。

2. 安全问题

  • 中间人攻击(MITM) :通过伪造证书或弱加密算法实施。
    • 防御:使用强加密套件、HSTS(HTTP 严格传输安全)、证书透明度(CT)。
  • 证书伪造 :攻击者伪造 CA 签名。
    • 防御:严格验证证书链,启用 OCSP Stapling。
  • 弱加密算法 :如 MD5、SHA-1、DES。
    • 防御:禁用不安全算法,强制 TLS 1.2/1.3。

3. 调试工具

  • Wireshark:捕获和分析 TLS 握手流量。
  • OpenSSL:测试 TLS 配置,生成证书。
  • SSL Labs:在线扫描服务器 TLS 配置,评估安全性。

六、总结

HTTPS 通过 TLS/SSL 协议实现了安全的网络通信,其握手过程确保了密钥的安全协商和身份验证。加密算法是 HTTPS 的核心,包括对称加密(AES)、非对称加密(RSA、ECC)、密钥交换(DH/ECDH)和哈希算法(SHA-256)。随着 TLS 1.3 的普及,HTTPS 在性能和安全性上进一步提升。理解这些机制有助于开发人员构建更安全的应用,同时应对潜在的攻击和优化通信效率。

未来,量子计算可能对传统加密算法(如 RSA)构成威胁,量子安全算法(如基于格的加密)将成为研究热点。


相关推荐
Marktowin3 小时前
Mybatis-Plus更新操作时的一个坑
java·后端
赵文宇4 小时前
CNCF Dragonfly 毕业啦!基于P2P的镜像和文件分发系统快速入门,在线体验
后端
程序员爱钓鱼4 小时前
Node.js 编程实战:即时聊天应用 —— WebSocket 实现实时通信
前端·后端·node.js
Libby博仙5 小时前
Spring Boot 条件化注解深度解析
java·spring boot·后端
源代码•宸5 小时前
Golang原理剖析(Map 源码梳理)
经验分享·后端·算法·leetcode·golang·map
小周在成长5 小时前
动态SQL与MyBatis动态SQL最佳实践
后端
瓦尔登湖懒羊羊5 小时前
TCP的自我介绍
后端
小周在成长5 小时前
MyBatis 动态SQL学习
后端
子非鱼9215 小时前
SpringBoot快速上手
java·spring boot·后端
我爱娃哈哈5 小时前
SpringBoot + XXL-JOB + Quartz:任务调度双引擎选型与高可用调度平台搭建
java·spring boot·后端