第二章 TLS基础概念:对称加密、非对称加密、哈希函数、数字签名

说实话,很多人学TLS一上来就啃RFC,结果被各种术语砸晕。我个人觉得,先把四个核心概念搞清楚,后面看协议就跟看剧本一样顺畅。哪四个?对称加密、非对称加密、哈希函数、数字签名。

这四位就像TLS的四根柱子。少一根,房子就得塌。我在项目里见过不少安全漏洞,追根溯源,都是对这几个基础概念理解不到位造成的。你想想看,如果连加密和签名都分不清,怎么去配置证书?怎么去排查握手失败?

2.1 对称加密 —— 数据传输的"锁"

对称加密说白了就是一把钥匙开一把锁。加密和解密用同一个密钥。效率高,适合处理大量数据。TLS里真正传输数据时用的就是它。

我在项目中遇到过一档子事:有人直接用AES的ECB模式加密HTTP响应。结果安全审计一看——相同的cookie块加密后一模一样,攻击者直接能推断用户行为。后来全部换成GCM模式才过关。

避坑指南: 我曾经在集成商代码里见过用ECB模式做TLS内部加密的。记住:ECB不适合协议数据,一定要用GCM或ChaCha20-Poly1305,它们自带完整性校验。

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握手阶段,非对称加密只用来交换一个临时对称密钥。真正传输数据时还是用对称加密。这叫"混合加密"——既安全又高效。

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后一切正常。

避坑指南: 我曾经见过生产环境中还在用MD5做完整性校验。MD5的碰撞攻击早在2004年就公开了。TLS中至少用SHA-256,推荐SHA-384。

TLS 1.3支持的哈希算法:

  • SHA-256 —— 最常用,证书签名、HKDF都靠它
  • SHA-384 —— 安全性更高,适合高安全场景
# 计算文件的SHA-256哈希值
openssl dgst -sha256 data.txt

2.4 数字签名 —— 身份的"印章"

数字签名就是私钥持有者对一段数据"盖个章",别人用公钥一验就知道是不是你干的。TLS里服务器发证书时,CA的签名就盖在证书上。浏览器验证签名,确认证书是真的。

我曾经被证书链验证不完整坑过——服务器只发了终端证书,没发中间CA证书。浏览器不认识签发者,直接报错。后来我养成了习惯:部署证书时一定检查完整链。

核心要点: 数字签名 ≠ 加密。签名证明"谁干的",加密保证"只有谁看"。TLS中两者配合:签名用于身份认证,加密用于数据保护。

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中有明确的分工和时序。我画了一张协作关系图,帮你一眼看清它们怎么配合:

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 证书验证、身份认证 与算法相关
总结一句话: 非对称加密搭桥,对称加密干活,哈希函数把关,数字签名画押。四者缺一不可,才是TLS真正的纵深防御。