第二章 数据安全基础:四种核心机制

各位好,我是老周。在正式开始折腾 数据令牌化传输 之前,咱们得先把地基打牢。说白了,TLS 加密传输无论怎么花哨,底层就靠四样东西:对称加密、非对称加密、哈希函数 和 消息认证码(MAC)。这四兄弟缺一个,安全链条就断了。我早年踩过的坑,十有八九都和没搞明白它们的区别有关。

这篇文章咱们就把这四个家伙掰开揉碎聊聊。别急,我不列什么“首先、其次”的清单,咱们直接看干货。

数据安全四大机制关系图 数据安全四大机制 & TLS 加密流程 密钥交换阶段 数据保护阶段 客户端 服务端 TLS 握手 非对称加密 (RSA/ECC) 交换对称密钥 对称加密 (AES-GCM) 使用会话密钥 哈希函数 (SHA-256) 完整性校验 消息认证码 (HMAC) 防篡改 + 认证 数据令牌化传输 说明:真实 TLS 1.3 握手还会涉及 DH 密钥协商、签名验证,但核心骨架就是这四件套

对称加密:快,但有共享密钥的烦恼

对称加密,顾名思义,加密和解密用同一把钥匙。它跑得飞快,适合大量数据的加密。常见的算法有 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())
我曾经踩过一个坑: EAX 模式被我在生产里误用——nonce 重复了,结果所有密文都可以被破解。后来我用 GCM 配合计数器,确保 nonce 不重复。

对称加密最大的问题:你必须把密钥安全地告诉对方。网络里不能明文传密钥,怎么办?这时候非对称加密就登场了。

非对称加密:公私钥搭配,干活不累

非对称加密用的是一对钥匙:公钥(公开)和私钥(自己藏好)。你用我公钥加密,只有我私钥能解开。TLS 握手阶段就是靠它来交换一个临时对称密钥的。

  • RSA:经典但慢,密钥越长越安全(至少 2048 位)。
  • ECC(椭圆曲线):比如 Curve25519,同样安全性下密钥短得多,性能更好。我个人偏爱 X25519。

你想想看,如果对称密钥是通过非对称加密保护的,那么就算中间人抓住了所有流量,也拿不到会话密钥。这就是 TLS 的核心原理。

对称加密 vs 非对称加密
特性对称加密非对称加密
密钥数量1 个共享密钥公钥 + 私钥
速度快(硬件加速常用)慢(比对称慢 100~1000 倍)
典型算法AES、ChaCha20RSA、ECC (ECDH)
主要用途加密海量数据密钥交换、数字签名
避坑指南: 不要直接用 RSA 加密海量数据!会慢到你怀疑人生。正确做法:用 RSA 加密一个随机对称密钥,然后用它做对称加密。

哈希函数:单向指纹,完整体检

哈希函数能把任意长度的数据,压缩成一个固定长度的摘要。而且它是单向的——你不能从摘要反推出原文。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 保证每条消息的真实性。这套组合拳,咱们做令牌化传输时就按这个思路来。