密码学基础:对称加密、非对称加密、哈希、数字签名

你学 TLS,绕不开密码学基础。别慌,我不打算给你填一堆数学公式。咱就把这四样东西说清楚,它们是怎么拧成一股绳的。

对称加密:快就一个字

对称加密,说白了就是加解密用同一把钥匙。你拿钥匙锁门,也用这把钥匙开门。效率高,适合传大块数据。

典型算法:AES、DES、3DES、SM4(国密)。现在主流是 AES-256。

我个人的经验:做支付接口时,敏感数据报文常先用对称加密。速度快,一方生成密钥,另一方拿到后解密。但问题来了——密钥怎么安全地传过去?这不,非对称加密就上场了。

非对称加密:不对称才是美

非对称加密有两把钥匙:公钥加密,私钥解密。公钥随便发,私钥自己死死藏好。

主要算法:RSA、ECC、SM2。RSA 用得广,但 ECC 在同等安全强度下密钥更短,性能更好。

特性对称加密非对称加密
密钥数量一把两把(公/私)
速度快(硬件加速常见)慢(100~1000倍差距)
典型用途大量数据传输密钥交换、数字签名
安全分发难度高(需事先共享)低(公钥可公开)

回想一下,我是怎么在 HTTPS 里用 AES 加密响应体的?其实就是靠非对称加密先把 AES 密钥传过去,再切到对称加密干活。这叫「混合加密」。

面试常问:为什么不用 RSA 直接加密全部数据?答:性能太差,一个请求几兆数据,用 RSA 加密能把 CPU 跑冒烟。

哈希:指纹(不可逆)

哈希能把任意数据变成固定长度的指纹。输入变了,指纹一定变。而且指纹不能反推出原文。

常见算法:MD5(已破不建议用)、SHA-1(已破)、SHA-256、SM3。

我习惯用 SHA-256 做消息完整性校验。TLS 里每个握手消息都会带一段哈希值,防止中途被篡改。

避坑指南:我曾经见过有人用 MD5 存用户密码,结果被彩虹表一阵乱打,全库沦陷。现在至少得加盐 + 慢哈希(bcrypt/scrypt)。但哈希本身不擅长存密码,它是校验工具,不是加密工具。

数字签名:让我相信你就是你

数字签名 = 哈希 + 非对称加密。流程这么走:

  1. 发送方对原始数据算哈希。
  2. 用私钥加密这个哈希,得到签名。
  3. 接收方用公钥解密签名,得到哈希值 A。
  4. 对收到的原始数据直接算哈希,得到哈希值 B。
  5. 比较 A 和 B:一样就说明数据来自私钥持有者且没篡改。

你想想看,TLS 的证书本身就是一组数字签名。CA 用私钥对你的证书签名,浏览器用 CA 公钥验证,证明这张证书不是伪造的。

# 用 OpenSSL 演示签名的生成与验证(Python 伪代码风格)
# 假设已有 RSA 密钥对

# 签名
import hashlib
signature = rsa_private_key.sign(hashlib.sha256(data).digest())

# 验证
hash_recovered = rsa_public_key.verify(signature)
assert hash_recovered == hashlib.sha256(data).digest()

四个概念如何协作?

我把这四者的关系画在一张图里,你一看就明白。

密码学基础核心概念关系 对称加密 AES / SM4 非对称加密 RSA / ECC / SM2 哈希函数 SHA-256 / SM3 数字签名 哈希 + 非对称加密 混合加密模式:非对称加密传递对称密钥 实际 TLS 中,先非对称握手协商密钥,后用对称加密传输数据

看到「数字签名」那块了吧?它就是哈希和非对称加密的合体。而混合加密模式则是非对称先帮你把对称密钥安全传过去,后面就交给对称加密跑高速。

总结一下

  • 对称加密:快,适合大数据,但密钥分发难。
  • 非对称加密:慢,适合小量关键信息(密钥/签名)。
  • 哈希:不可逆,用于校验完整性、防篡改。
  • 数字签名:证明身份 + 防篡改,是证书体系的根基。

学 TLS 时别把这几样分开看。实际握手里它们是接力赛运动员——非对称先跑第一棒,对称接棒,哈希和签名在全程做裁判。