加密是互联网安全的基石。无论是你登录网站、刷银行卡,还是两个服务之间传数据,背后都离不开加密技术。本文用大白话讲清楚:对称加密、非对称加密、哈希摘要的区别,以及 HTTPS、JWT、SSO 这些实际场景中的加解密是怎么玩的。

1. 加密到底是什么:先讲个故事

想象你要给朋友寄一封情书,但又怕被别人看到。你和朋友约定了一个暗号:把每个字母往后挪 3 位。比如 A → DB → EHELLO 就变成 KHOOR

  • 原文:你想说的话(HELLO)
  • 密文:加密后的乱码(KHOOR)
  • 密钥:约定的规则(往后挪 3 位)
  • 加密:用规则把原文变成乱码
  • 解密:用规则把乱码还原成原文

这就是加密的本质:让没有密钥的人看不懂内容

2. 对称加密:一把钥匙开一把锁

2.1 什么是对称加密

大白话:你和朋友用同一把钥匙,你用它锁门(加密),朋友也用它开门(解密)。

graph LR A[原文: HELLO] -->|密钥 K| B[加密算法] B --> C[密文: Xk9@#] C -->|同一个密钥 K| D[解密算法] D --> E[原文: HELLO] style A fill:#fecaca,stroke:#ef4444 style C fill:#fef3c7,stroke:#f59e0b style E fill:#d1fae5,stroke:#10b981

2.2 常见的对称加密算法

算法 密钥长度 安全性 使用场景
AES 128/192/256 位 极高(目前无法破解) HTTPS 数据传输、文件加密、数据库加密
DES 56 位 低(已被淘汰) 历史遗留系统
3DES 112/168 位 中等 金融行业(逐步被 AES 替代)
ChaCha20 256 位 极高 移动端(比 AES 更省电)

2.3 对称加密的优缺点

优点
  • 速度快:加解密效率高,适合大数据量
  • 算法成熟:AES 经过多年验证,安全可靠
致命问题

密钥怎么给对方?如果你们从没见过面,怎么安全地把钥匙交给对方?

  • 网络传输?万一被截获,对方就能解密所有内容
  • 线下交换?成本太高,不现实

这就是对称加密的密钥分发难题,也是非对称加密要解决的问题。

3. 非对称加密:两把钥匙配合用

3.1 什么是非对称加密

大白话:你有两把钥匙——公钥(可以公开)和私钥(绝对保密)。它们是一对,用公钥锁的东西,只有私钥能开。

graph LR subgraph 发送方 A[原文] -->|用对方的公钥| B[加密] end B --> C[密文] subgraph 接收方 C -->|用自己的私钥| D[解密] D --> E[原文] end style A fill:#fecaca,stroke:#ef4444 style C fill:#fef3c7,stroke:#f59e0b style E fill:#d1fae5,stroke:#10b981

3.2 公钥和私钥的关系

特性 公钥(Public Key) 私钥(Private Key)
谁持有 任何人都可以有 只有自己持有,绝对保密
用途 1 加密数据(发给私钥持有者) 解密数据
用途 2 验证签名 生成签名(证明身份)
类比 邮箱地址(公开的) 邮箱密码(只有你知道)

3.3 常见的非对称加密算法

算法 密钥长度 特点 使用场景
RSA 2048/4096 位 应用最广,兼容性好 HTTPS 证书、SSH 密钥、数字签名
ECC(椭圆曲线) 256 位(等效 RSA 3072 位) 密钥短、效率高 移动端、物联网、区块链
Ed25519 256 位 签名速度快 SSH 密钥、API 签名

3.4 非对称加密解决了什么问题

密钥分发问题完美解决

你把公钥贴在网上,任何人都能用它给你加密信息。但只有你有私钥,只有你能解密。

全程不需要交换私钥,黑客截获公钥也没用,因为公钥只能加密不能解密。

缺点
  • 速度慢:比对称加密慢 100-1000 倍
  • 不适合大数据:通常只用来加密"密钥"或"签名"

4. 哈希/摘要:不可逆的"指纹"

4.1 什么是哈希

大白话:把任意长度的数据,压缩成固定长度的"指纹"。这个过程不可逆——你无法从指纹还原出原文。

graph LR A["任意长度数据
(1KB 或 1GB)"] --> B["哈希算法
(SHA-256)"] B --> C["固定长度指纹
(256 位 / 32 字节)"] style A fill:#fecaca,stroke:#ef4444 style C fill:#d1fae5,stroke:#10b981

4.2 哈希的特性

特性 说明 大白话
固定长度 无论输入多大,输出长度固定 1KB 文件和 1GB 文件,指纹都是 32 字节
不可逆 无法从哈希值还原原文 知道指纹,推不出是谁的
雪崩效应 原文改一点,哈希值完全不同 改一个字,指纹面目全非
抗碰撞 几乎不可能找到两个不同输入有相同哈希 不同的人,指纹不会一样

4.3 常见哈希算法

算法 输出长度 安全性 使用场景
MD5 128 位 已破解,不安全 仅用于文件校验(非安全场景)
SHA-1 160 位 已破解,不推荐 历史遗留
SHA-256 256 位 安全 JWT 签名、区块链、密码存储
bcrypt 可变 专为密码设计 用户密码存储(有盐值、慢哈希)

4.4 哈希的典型用途

  • 密码存储:数据库只存密码的哈希值,验证时比较哈希是否一致
  • 文件校验:下载文件后算哈希,和官方公布的比对,确认没被篡改
  • 数字签名:先对内容算哈希,再对哈希值加密(见下文)

5. 三种加密技术的对比

维度 对称加密 非对称加密 哈希/摘要
密钥数量 1 把(双方共享) 2 把(公钥 + 私钥) 无密钥
可逆性 可逆(能解密) 可逆(能解密) 不可逆
速度 慢(100-1000 倍)
典型用途 大数据加密 密钥交换、数字签名 完整性校验、密码存储
代表算法 AES、ChaCha20 RSA、ECC SHA-256、bcrypt
核心理解

实际场景中,这三种技术通常配合使用

  • 非对称加密:交换对称密钥
  • 对称加密:加密实际数据
  • 哈希:保证数据完整性

6. HTTPS:三种加密的完美配合

当你访问 https:// 网站时,浏览器和服务器之间发生了什么?

6.1 HTTPS 握手流程(TLS 1.2)

sequenceDiagram participant 浏览器 participant 服务器 Note over 浏览器,服务器: 1. 建立安全通道 浏览器->>服务器: ClientHello(支持的加密算法列表) 服务器->>浏览器: ServerHello(选定的算法)+ 证书(含公钥) Note over 浏览器: 2. 验证证书真实性 浏览器->>浏览器: 用 CA 公钥验证服务器证书 Note over 浏览器,服务器: 3. 交换对称密钥 浏览器->>浏览器: 生成随机对称密钥(会话密钥) 浏览器->>服务器: 用服务器公钥加密会话密钥 服务器->>服务器: 用私钥解密,得到会话密钥 Note over 浏览器,服务器: 4. 使用对称加密通信 浏览器->>服务器: 用会话密钥加密数据 服务器->>浏览器: 用会话密钥加密响应

6.2 每个阶段用了什么加密

阶段 加密技术 具体作用
验证证书 非对称加密(RSA/ECC) 用 CA 公钥验证服务器证书的签名
交换密钥 非对称加密(RSA/ECDHE) 安全地把对称密钥传给服务器
传输数据 对称加密(AES/ChaCha20) 加密实际的网页内容
完整性校验 哈希(SHA-256) 确保数据没被篡改(MAC)
为什么这么设计?
  • 非对称加密解决"密钥怎么传":用公钥加密对称密钥,安全传输
  • 对称加密解决"传输效率":速度快,适合大数据量
  • 哈希解决"数据被篡改":保证完整性

7. JWT Token:签名的典型应用

登录成功后,服务器给你一个 JWT Token,里面装着你的身份信息。但怎么防止有人伪造 Token?

7.1 JWT 的结构

eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjEyMywiZXhwIjoxNzA5MDAwMDAwfQ.X7dKxY2Z9Q8w3V1mNpRqT5a6bC0f

JWT 由三部分组成,用 . 分隔:

部分 内容 是否加密
Header 算法类型(如 HS256、RS256) Base64 编码,不加密
Payload 用户数据(userId、过期时间等) Base64 编码,不加密
Signature 签名 加密(保证前两部分没被篡改)

7.2 签名是怎么生成的

graph LR A[Header + Payload] --> B["哈希算法
(HMAC-SHA256)"] C[密钥] --> B B --> D[Signature 签名] style A fill:#fecaca,stroke:#ef4444 style C fill:#fef3c7,stroke:#f59e0b style D fill:#d1fae5,stroke:#10b981
// 签名生成过程
Signature = HMAC-SHA256(
  base64(Header) + "." + base64(Payload),
  密钥
)

7.3 两种签名算法对比

算法 类型 密钥 适用场景
HS256 对称加密 同一个密钥签名和验证 单体应用(后端自己签、自己验)
RS256 非对称加密 私钥签名、公钥验证 微服务/SSO(认证中心签、各服务验)
JWT 的安全注意事项
  • Payload 不加密:任何人都能 Base64 解码看到内容,不要放敏感信息(如密码)
  • 签名只防篡改:别人能看,但改了就验签失败
  • 必须用 HTTPS:防止 Token 被截获

8. SSO 单点登录:完整的加解密流程

SSO(Single Sign-On)让你只登录一次,就能访问多个系统(如登录淘宝后,自动登录天猫、支付宝)。

8.1 SSO 的核心角色

角色 说明 类比
认证中心(SSO Server) 统一负责登录验证、签发令牌 公安局(发身份证)
业务系统(Client) 淘宝、天猫等具体应用 银行、酒店(验身份证)
用户

8.2 SSO 登录流程(以 CAS 协议为例)

sequenceDiagram participant 用户 participant 淘宝 participant 认证中心 participant 天猫 Note over 用户,天猫: 第一次访问淘宝 用户->>淘宝: 1. 访问淘宝 淘宝->>淘宝: 检查:没有登录态 淘宝->>用户: 2. 重定向到认证中心 用户->>认证中心: 3. 请求登录页 认证中心->>用户: 4. 返回登录页 用户->>认证中心: 5. 提交账号密码 Note over 认证中心: 6. 验证账号密码
哈希比对 认证中心->>认证中心: 7. 生成 ST(Service Ticket) Note over 认证中心: 用私钥签名 ST 认证中心->>用户: 8. 重定向回淘宝 + ST 用户->>淘宝: 9. 携带 ST 访问 淘宝->>认证中心: 10. 验证 ST Note over 认证中心: 用公钥验签 认证中心->>淘宝: 11. 返回用户信息 淘宝->>淘宝: 12. 创建本地会话 淘宝->>用户: 13. 登录成功 Note over 用户,天猫: 第二次访问天猫(已登录) 用户->>天猫: 14. 访问天猫 天猫->>天猫: 检查:没有本地登录态 天猫->>用户: 15. 重定向到认证中心 用户->>认证中心: 16. 请求(带全局会话 Cookie) 认证中心->>认证中心: 17. 已登录,直接签发 ST 认证中心->>用户: 18. 重定向回天猫 + ST 用户->>天猫: 19. 携带 ST 访问 天猫->>认证中心: 20. 验证 ST 认证中心->>天猫: 21. 返回用户信息 天猫->>用户: 22. 免登录成功

8.3 SSO 中的加解密环节

环节 加密技术 具体说明
密码验证 哈希(bcrypt) 数据库存的是密码哈希,登录时比对哈希值
令牌签发 非对称加密(RS256) 认证中心用私钥签名 Token
令牌验证 非对称加密 各业务系统用公钥验签
传输保护 HTTPS(对称 + 非对称) 防止令牌被截获
为什么 SSO 用非对称加密?
  • 认证中心:持有私钥,负责签发令牌
  • 各业务系统:只需要公钥,就能验证令牌
  • 好处:业务系统无法伪造令牌(没有私钥),即使某个业务系统被攻破,也不会影响其他系统

9. 服务间通信的加密实践

在微服务架构中,服务 A 调用服务 B,怎么保证安全?

9.1 内网 vs 公网

场景 常见做法 说明
内网调用 可不加密,但建议 mTLS 信任内网环境,但零信任架构建议加密
跨公网调用 必须 HTTPS + 身份认证 公网不可信,必须加密 + 验证身份

9.2 服务间身份认证方案

方案 原理 适用场景
API Key 固定密钥,放在请求头 简单场景、内部服务
JWT Token 签名令牌,包含调用方信息 微服务间调用
mTLS(双向 TLS) 客户端和服务端都验证证书 高安全场景(金融、政务)
OAuth 2.0 Client Credentials 获取 Access Token 调用 第三方服务调用

9.3 mTLS 双向认证流程

sequenceDiagram participant 服务A participant 服务B 服务A->>服务B: 1. ClientHello 服务B->>服务A: 2. ServerHello + 服务B证书 服务B->>服务A: 3. 请求客户端证书 Note over 服务A: 验证服务B证书 服务A->>服务B: 4. 服务A证书 + 密钥交换 Note over 服务B: 验证服务A证书 服务A->>服务B: 5. 加密数据传输 服务B->>服务A: 6. 加密响应
mTLS 的优势
  • 双向验证:不仅客户端验证服务端,服务端也验证客户端
  • 证书管理:配合证书管理系统(如 Vault),可以自动轮换证书
  • 零信任:符合"永不信任,始终验证"的安全理念

10. 总结:加密技术选型指南

场景 推荐技术 说明
用户密码存储 bcrypt / Argon2 专为密码设计的慢哈希 + 盐值
数据传输加密 HTTPS(TLS 1.3) 对称 + 非对称 + 哈希组合
API 身份认证 JWT(RS256) 非对称签名,公钥验证
文件完整性校验 SHA-256 计算哈希,比对确认
大数据加密存储 AES-256-GCM 对称加密,带认证标签
服务间安全通信 mTLS + JWT 传输层加密 + 应用层身份
安全红线
  • 不要自己造加密算法:用成熟的库(OpenSSL、libsodium)
  • 不要硬编码密钥:用密钥管理服务(Vault、KMS)
  • 不要用 MD5/SHA1 做安全用途:已被破解
  • 不要明文存储密码:必须用慢哈希 + 盐值
  • 不要忽略证书过期:配置自动续期

11. 延伸阅读