第二章 TLS基础概念:对称加密、非对称加密、哈希函数、数字签名
说实话,很多人学TLS一上来就啃RFC,结果被各种术语砸晕。我个人觉得,先把四个核心概念搞清楚,后面看协议就跟看剧本一样顺畅。哪四个?对称加密、非对称加密、哈希函数、数字签名。
这四位就像TLS的四根柱子。少一根,房子就得塌。我在项目里见过不少安全漏洞,追根溯源,都是对这几个基础概念理解不到位造成的。你想想看,如果连加密和签名都分不清,怎么去配置证书?怎么去排查握手失败?
2.1 对称加密 —— 数据传输的"锁"
对称加密说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。效率高,适合处理大量数据。TLS里真正传输数据时用的就是它。
我在项目中遇到过一档子事:有人直接用AES的ECB模式加密HTTP响应。结果安全审计一看——相同的cookie块加密后一模一样,攻击者直接能推断用户行为。后来全部换成GCM模式才过关。
TLS 1.3中主推的对称加密算法:
- AES-256-GCM —— 硬件加速支持好,性能稳
- ChaCha20-Poly1305 —— 移动端友好,无硬件加速时更快
# 用OpenSSL测试AES-256-GCM加密
openssl enc -aes-256-gcm -K 0123456789abcdef0123456789abcdef \
-iv 0123456789abcdef -in plaintext.txt -out ciphertext.bin
2.2 非对称加密 —— 密钥交换的"桥"
非对称加密有两个钥匙:公钥和私钥。公钥公开,私钥自己藏好。你用公钥加密,只有我能用私钥解开。这就解决了"怎么安全地把密钥告诉对方"这个老大难问题。
我见过不少早期项目还在用1024位RSA。说真的,1024位在今天已经跟纸糊的差不多了。NIST都要求至少2048位,我个人建议直接用3072位或者切到ECDHE。
TLS中常见的非对称加密方案:
- RSA —— 经典,但不支持前向安全性
- ECDHE —— 椭圆曲线密钥交换,支持前向安全性,TLS 1.3标配
# 生成ECDHE密钥对(P-256曲线)
openssl ecparam -genkey -name prime256v1 -out ecdhe_private.pem
openssl ec -in ecdhe_private.pem -pubout -out ecdhe_public.pem
2.3 哈希函数 —— 数据完整的"指纹"
哈希函数能把任意长度的数据"挤"成固定长度的摘要。而且它是单向的——从摘要反推原始数据,理论上不可能。TLS用它来保证数据没被篡改。
我记得有次排查一个证书校验失败的问题,折腾了半天才发现是对方还在用SHA-1哈希。浏览器早就标记SHA-1为不安全了。升级到SHA-256后一切正常。
TLS 1.3支持的哈希算法:
- SHA-256 —— 最常用,证书签名、HKDF都靠它
- SHA-384 —— 安全性更高,适合高安全场景
# 计算文件的SHA-256哈希值
openssl dgst -sha256 data.txt
2.4 数字签名 —— 身份的"印章"
数字签名就是私钥持有者对一段数据"盖个章",别人用公钥一验就知道是不是你干的。TLS里服务器发证书时,CA的签名就盖在证书上。浏览器验证签名,确认证书是真的。
我曾经被证书链验证不完整坑过——服务器只发了终端证书,没发中间CA证书。浏览器不认识签发者,直接报错。后来我养成了习惯:部署证书时一定检查完整链。
TLS中常用的签名算法:
- RSA-PSS —— RSA的改进版,安全性更好
- ECDSA —— 基于椭圆曲线,签名短、性能高
# 使用ECDSA签名文件
openssl dgst -sha256 -sign ecdhe_private.pem -out signature.bin data.txt
# 验证签名
openssl dgst -sha256 -verify ecdhe_public.pem -signature signature.bin data.txt
2.5 四者协作:TLS中的默契配合
四个概念不是孤立的。它们在TLS中有明确的分工和时序。我画了一张协作关系图,帮你一眼看清它们怎么配合:
2.6 核心概念对比
这四个概念容易混淆。我整理了一张对照表,把它们的核心差异列清楚:
| 概念 | 核心特点 | TLS 1.3推荐算法 | 在TLS中的角色 | 密钥/输出长度 |
|---|---|---|---|---|
| 对称加密 | 加密解密同密钥,速度快 | AES-256-GCM, ChaCha20-Poly1305 | 加密实际传输的HTTP数据 | 256位 |
| 非对称加密 | 公钥加密私钥解密,速度慢 | ECDHE (P-256), X25519 | 握手阶段协商对称密钥 | 256位(椭圆曲线) |
| 哈希函数 | 单向不可逆,定长输出 | SHA-256, SHA-384 | 完整性校验、派生密钥 | 256/384位 |
| 数字签名 | 私钥签名,公钥验证 | ECDSA (P-256), RSA-PSS | 证书验证、身份认证 | 与算法相关 |