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)构成威胁,量子安全算法(如基于格的加密)将成为研究热点。


相关推荐
爱发飙的蜗牛30 分钟前
springboot--web开发请求参数接收注解
java·spring boot·后端
橘猫云计算机设计1 小时前
springboot-基于Web企业短信息发送系统(源码+lw+部署文档+讲解),源码可白嫖!
java·前端·数据库·spring boot·后端·小程序·毕业设计
程序猿chen1 小时前
JVM考古现场(二十五):逆熵者·时间晶体的永恒之战(进阶篇)
java·jvm·git·后端·程序人生·java-ee·改行学it
细心的莽夫1 小时前
Elasticsearch复习笔记
java·大数据·spring boot·笔记·后端·elasticsearch·docker
程序员阿鹏2 小时前
实现SpringBoot底层机制【Tomcat启动分析+Spring容器初始化+Tomcat 如何关联 Spring容器】
java·spring boot·后端·spring·docker·tomcat·intellij-idea
刘大猫262 小时前
Arthas sc(查看JVM已加载的类信息 )
人工智能·后端·算法
Asthenia04123 小时前
操作系统/进程线程/僵尸进程/IPC与PPC/进程大小/进程的内存组成/协程相关/Netty相关拷打
后端
Asthenia04123 小时前
深入解析 MySQL 执行更新语句、查询语句及 Redo Log 与 Binlog 一致性
后端
杨充4 小时前
10.接口而非实现编程
后端