第二章 数据安全基础:四种核心机制
各位好,我是老周。在正式开始折腾 数据令牌化传输 之前,咱们得先把地基打牢。说白了,TLS 加密传输无论怎么花哨,底层就靠四样东西:对称加密、非对称加密、哈希函数 和 消息认证码(MAC)。这四兄弟缺一个,安全链条就断了。我早年踩过的坑,十有八九都和没搞明白它们的区别有关。
这篇文章咱们就把这四个家伙掰开揉碎聊聊。别急,我不列什么“首先、其次”的清单,咱们直接看干货。
对称加密:快,但有共享密钥的烦恼
对称加密,顾名思义,加密和解密用同一把钥匙。它跑得飞快,适合大量数据的加密。常见的算法有 AES、ChaCha20。我个人习惯在项目里用 AES-256-GCM,为什么?因为它同时提供加密和身份认证,省事儿。
来,看个最简的 Python 示例,感受一下。
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
import os
key = os.urandom(32) # 256 位密钥
nonce = os.urandom(12) # GCM 推荐的 nonce 长度
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
encryptor = cipher.encryptor()
ciphertext = encryptor.update(b"令牌化数据: 卡号 4111-****-****-1234") + encryptor.finalize()
print("加密完成,GCM 标签:", encryptor.tag.hex())
对称加密最大的问题:你必须把密钥安全地告诉对方。网络里不能明文传密钥,怎么办?这时候非对称加密就登场了。
非对称加密:公私钥搭配,干活不累
非对称加密用的是一对钥匙:公钥(公开)和私钥(自己藏好)。你用我公钥加密,只有我私钥能解开。TLS 握手阶段就是靠它来交换一个临时对称密钥的。
- RSA:经典但慢,密钥越长越安全(至少 2048 位)。
- ECC(椭圆曲线):比如 Curve25519,同样安全性下密钥短得多,性能更好。我个人偏爱 X25519。
你想想看,如果对称密钥是通过非对称加密保护的,那么就算中间人抓住了所有流量,也拿不到会话密钥。这就是 TLS 的核心原理。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个共享密钥 | 公钥 + 私钥 |
| 速度 | 快(硬件加速常用) | 慢(比对称慢 100~1000 倍) |
| 典型算法 | AES、ChaCha20 | RSA、ECC (ECDH) |
| 主要用途 | 加密海量数据 | 密钥交换、数字签名 |
哈希函数:单向指纹,完整体检
哈希函数能把任意长度的数据,压缩成一个固定长度的摘要。而且它是单向的——你不能从摘要反推出原文。SHA-256 现在是最低门槛,输出 32 字节。
我用哈希函数一般做两件事:
① 完整性校验——下载文件后对比哈希值,确保没被篡改。
② 存储密码——但注意!哈希不能直接存密码,得加盐(salt)和迭代。不过那是另一章的事了。
我遇到过有人把 MD5 用在生产环境……嗯,后来被攻击者轻松碰撞了。现在务必用 SHA-256 或更高的 SHA-3。
消息认证码(MAC):不仅要完整,还得验明正身
哈希只能保证数据没变,但不能保证数据是谁发的。如果攻击者同时替换了数据和哈希值,你根本发现不了。这时候就需要 消息认证码。它结合了密钥和哈希算法,只有知道密钥的双方才能计算出正确的 MAC。
最常用的是 HMAC(Hash-based Message Authentication Code)。比如 HMAC-SHA256。
import hmac
import hashlib
key = b"共享密钥,别泄漏"
message = b"转账 10000 元给 Alice"
mac = hmac.new(key, message, hashlib.sha256).digest()
print("HMAC:", mac.hex())
你想想看,在 TLS 中,每条记录都会带一个 MAC。接收方验证 MAC 正确,才能说明数据确实是对方发的,而且中途没人动过。
核心总结
- 对称加密:快,适合数据加密,但密钥分发难。
- 非对称加密:慢,用于安全交换对称密钥。
- 哈希函数:校验完整性,但不能防伪造。
- 消息认证码(MAC):防伪造 + 完整性,需要密钥。
TLS 把四者组合起来:先用非对称加密交换临时对称密钥,再用对称加密保护数据流,最后附上 HMAC 保证每条消息的真实性。这套组合拳,咱们做令牌化传输时就按这个思路来。