密码学基础回顾:对称加密与非对称加密、哈希函数与消息认证码、数字签名与证书、密钥生成与随机数

聊 KMS 之前,得先把这几个密码学基础夯实了。我平时带团队,发现不少问题其实都出在基本功上——你想想,密钥都管不好,存储安全就是空中楼阁。

对称加密与 AES

对称加密,说白了就是加密和解密用同一个密钥。就像你用一把钥匙锁门,同一把钥匙开门。速度快,适合大量数据。

AES 是我最常用的对称算法。128 位密钥基本够用,但我在金融机构的项目里,客户强制要求用 256 位。嗯,合规需要,成本也不高。

小提示:AES 有 ECB、CBC、GCM 等模式。ECB 不安全,别用了。我见过有人把 ECB 用在图片加密上,结果密文还能看出轮廓……GCM 带认证,推荐。

非对称加密与 RSA/ECC

非对称加密,一对儿密钥——公钥公开,私钥自己藏着。加密用公钥,解密用私钥。说白了,别人用我的公钥加密消息,只有我能解开。

RSA 经典,但密钥越长越慢。我做过一个 IoT 项目,设备 CPU 弱,RSA 2048 位握手直接超时。后来换了 ECC(椭圆曲线),256 位就能达到同等安全强度,速度快了不少。

特性对称加密非对称加密
密钥单一密钥公钥+私钥
速度快(硬件加速)慢(数学运算复杂)
典型用途数据加密密钥交换、数字签名
代表算法AES, SM4RSA, ECC, SM2

哈希函数与消息认证码

哈希函数,把任意长度消息变成固定长度的摘要。不可逆,雪崩效应——改一个 bit,结果天差地别。

我曾经遇到一个运维同学,拿 MD5 当密码哈希用。我赶紧让他停掉——MD5 已经能被碰撞了。现在推荐 SHA-256 或 SM3。

消息认证码(MAC),是在哈希上加了一把钥匙。你想想看,光哈希能验证完整性,但谁都能算。加上密钥之后,只有持有密钥的人才能算出正确的 MAC,这叫“带密钥的哈希”。

警告:别把哈希和 MAC 搞混。哈希只防无意的篡改,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 + 加密
核心原则:密钥生成时使用的随机数,必须在密码学上安全。生产环境永远不要用伪随机数生成器(PRNG)中的 weak 版本,比如 Python 的 random 模块。

好,把这些基础概念串起来,我画了一张图,看看它们之间的关系。

密码学基础组件关系图 密码学基础组件关系 密钥生成与随机数 对称加密 (AES/SM4) 非对称加密 (RSA/ECC) 哈希函数 (SHA-256) 消息认证码 (HMAC) 数字签名与证书 箭头方向:密钥生成为对称/非对称/哈希提供种子,哈希和对称/非对称共同支撑数字签名与证书

这图我画了半天——中心是密钥生成与随机数,它给对称加密、非对称加密、哈希函数提供高质量的密钥或种子。对称加密和非对称加密管机密性,哈希和 MAC 管完整性与认证,最后数字签名和证书把公钥绑定到实体上。一环扣一环,少一个都不行。

我在实际 KMS 设计里,经常要反复核对这几个基础组件的边界——比如,密钥存储时,是对称加密保护还是用非对称包裹?完整性校验用 HMAC 还是数字签名?这些问题没有标准答案,得看场景。但你基础牢了,决策自然就准了。

嗯,这一章就说这么多。记住一句话:密码学不是拼图游戏,是系统工程的基石。