密码学基础回顾:对称加密与非对称加密、哈希函数与消息认证码、数字签名与证书、密钥生成与随机数
聊 KMS 之前,得先把这几个密码学基础夯实了。我平时带团队,发现不少问题其实都出在基本功上——你想想,密钥都管不好,存储安全就是空中楼阁。
对称加密与 AES
对称加密,说白了就是加密和解密用同一个密钥。就像你用一把钥匙锁门,同一把钥匙开门。速度快,适合大量数据。
AES 是我最常用的对称算法。128 位密钥基本够用,但我在金融机构的项目里,客户强制要求用 256 位。嗯,合规需要,成本也不高。
非对称加密与 RSA/ECC
非对称加密,一对儿密钥——公钥公开,私钥自己藏着。加密用公钥,解密用私钥。说白了,别人用我的公钥加密消息,只有我能解开。
RSA 经典,但密钥越长越慢。我做过一个 IoT 项目,设备 CPU 弱,RSA 2048 位握手直接超时。后来换了 ECC(椭圆曲线),256 位就能达到同等安全强度,速度快了不少。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥 | 单一密钥 | 公钥+私钥 |
| 速度 | 快(硬件加速) | 慢(数学运算复杂) |
| 典型用途 | 数据加密 | 密钥交换、数字签名 |
| 代表算法 | AES, SM4 | RSA, ECC, SM2 |
哈希函数与消息认证码
哈希函数,把任意长度消息变成固定长度的摘要。不可逆,雪崩效应——改一个 bit,结果天差地别。
我曾经遇到一个运维同学,拿 MD5 当密码哈希用。我赶紧让他停掉——MD5 已经能被碰撞了。现在推荐 SHA-256 或 SM3。
消息认证码(MAC),是在哈希上加了一把钥匙。你想想看,光哈希能验证完整性,但谁都能算。加上密钥之后,只有持有密钥的人才能算出正确的 MAC,这叫“带密钥的哈希”。
数字签名与证书
数字签名是反过来的非对称加密——用私钥签名,用公钥验证。说白了,你拿私钥给一段数据打个标记,别人用你的公钥一验,就知道这数据是你发的,而且没被改过。
证书呢?就是把公钥和身份绑在一起。比如 HTTPS 里用的 X.509 证书,CA 机构帮你背书。我自己搭建过内部 KMS 的 CA,签发证书时注意两点:一是证书链要完整,二是私钥存储必须安全(硬件安全模块)。
密钥生成与随机数
这是 KMS 的根基。密钥生成的核心是——随机数质量。如果你用了一个可预测的随机数,密钥等于没生成。我记得有个项目,某厂商用的 rand() 函数,种子是当前时间戳,测试的时候我直接逆推出来了……那场面,尴尬。
好的随机数来源:硬件的真随机数生成器(TRNG),或者操作系统的 /dev/urandom。我在生产环境里只用 TRNG,配合 NIST SP 800-90A 的 DRBG 做后处理。
# 安全随机密钥生成示例(Python)
import os
from cryptography.hazmat.primitives import key_serialization, hashes
from cryptography.hazmat.primitives.asymmetric import rsa
# 对称密钥
aes_key = os.urandom(32) # 256位
print(f"AES Key (hex): {aes_key.hex()}")
# 非对称密钥对
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
private_bytes = private_key.private_bytes(...) # 建议用 PKCS8 + 加密
好,把这些基础概念串起来,我画了一张图,看看它们之间的关系。
这图我画了半天——中心是密钥生成与随机数,它给对称加密、非对称加密、哈希函数提供高质量的密钥或种子。对称加密和非对称加密管机密性,哈希和 MAC 管完整性与认证,最后数字签名和证书把公钥绑定到实体上。一环扣一环,少一个都不行。
我在实际 KMS 设计里,经常要反复核对这几个基础组件的边界——比如,密钥存储时,是对称加密保护还是用非对称包裹?完整性校验用 HMAC 还是数字签名?这些问题没有标准答案,得看场景。但你基础牢了,决策自然就准了。
嗯,这一章就说这么多。记住一句话:密码学不是拼图游戏,是系统工程的基石。