密码学基础回顾:对称加密、非对称加密、哈希

做 KMS 和 HSM 集成这么多年,我经常跟团队说一句话:不懂密码学基础,就别碰密钥管理。这章我们快速过一遍三大核心算法族——对称加密、非对称加密、哈希。你别当复习课听,我会讲点实际项目里踩过的坑。

对称加密:快,但钥匙怎么分?

对称加密,说白了就一把钥匙。加密用它,解密也用它。算法上 AES(尤其 AES-256)现在是公认的标配。我在给某金融机构做 HSM 迁移时遇到过老系统还在用 DES,嗯,当时吓得我连夜写了风险评估报告——DES 的 56 位密钥,用现在的 GPU 集群几小时就爆了。

说到模式,大家最常用的是 AES-GCM 和 AES-CBC。我个人的习惯是:能上 GCM 就别用 CBC。为什么?

  • GCM 是认证加密模式,自带完整性校验。加密的同时生成 MAC,防止篡改。我做过一个网关项目,用 CBC 加密后忘了加 HMAC,结果被中间人改密文导致业务崩溃。惨痛教训。
  • CBC 需要一个随机 IV,而且不防篡改。你必须在外面再套一层 HMAC,麻烦且容易出错。

对称加密主要用在大量数据加密(比如数据库存储加密、文件加密),因为性能极高。HSM 里硬件加速 AES-GCM 带宽可以到 10 Gbps+,软件实现的话就差远了。

避坑点:我曾经在配置 KMS 的 envelope encryption 时,习惯把数据密钥(DEK)直接挂在密文头上。结果有人反馈说 DEK 长度不对——原来我用的是 256 位密钥,但某个 SDK 默认只读 128 位。从此我强制在协议头里显式写明密钥算法和长度,不能依赖隐式约定。

非对称加密:公私钥分离,性能是瓶颈

非对称加密(也称公钥加密)解决了对称加密最头疼的问题——密钥分发。你留私钥,我拿公钥,就能安全通信。主流算法:RSA、ECC(椭圆曲线),现在还有后量子算法在路上了。

RSA 密钥长度推荐 2048 位以上。3072 位是当前主流,4096 位虽然更安全但签名/解密慢得让人抓狂。我测过一台 HSM 跑 RSA-4096 签名,每秒不到 2000 次,而 ECC P-256 能到 5 万次。所以,能上 ECC 就别硬扛 RSA。

非对称加密在 KMS 场景里最常见的用途:

  1. 密钥协商(如 ECDH)——建立共享秘密。
  2. 数字签名(如 ECDSA、RSA-PSS)——验证数据来源和完整性。
  3. 证书签发——PKI 的命根子。

但注意:非对称加密不适合加密大块数据。RSA 加密长度受限(2048 位密钥最多加密 245 字节)。所以实际方案都是“混合加密”:用非对称加密保护对称密钥,再用对称加密处理真实数据。这就是 KMS 里 envelope encryption 的底层逻辑。

我记得有个客户想把整个数据库用 RSA 加密,我赶紧叫停——真那么干,加密 1GB 数据得花几个小时,而且密钥长度限制导致逻辑极其复杂。后来改成 AES-256-GCM + RSA 密钥包装,性能提升上千倍。

哈希:指纹,不是加密

哈希函数把任意长度数据映射成固定长度的摘要。注意,它不是加密——加密可逆,哈希不可逆。大家最熟的 SHA-256(输出 256 位)和 SHA-3(新一代标准)。

哈希在密钥管理里的应用很广:

  • 密钥派生:用 KDF(如 HKDF)从主密钥派生子密钥,底层依赖哈希。
  • 完整性校验:计算文件或消息的哈希值,比对是否被篡改。
  • 口令存储:不能明文存密码,要用加盐哈希(如 bcrypt、scrypt)。
  • 证书指纹:CA 对证书内容的哈希值做签名,验证时重新算一次。

我曾经被问过一个很尴尬的问题:“SHA-256 碰撞概率多大?” 嗯,理论上 2^128 次尝试才会有一半概率碰撞。你想想看,这个数字比宇宙原子数还大。但注意——MD5 和 SHA-1 已经彻底不安全了。我在项目评审时只要看到 SHA-1 就无条件打回,哪怕只是用来做校验和。Google 在 2017 年就演示了 SHA-1 碰撞攻击(SHAttered),成本才 11 万美元。

⚠️ 避坑指南:我曾经在 KMS 的密钥派生流程里,直接用原始密钥作为 HMAC 密钥做 HKDF-Expand。正确做法是先提取(extract)再扩展(expand),而且提取阶段要用独立的随机盐。否则主密钥部分泄漏可能被反推子密钥。细节决定安全。

三者关系——一个完整的加密场景

我把对称加密、非对称加密、哈希结合起来画张图,你看一眼就明白了。

三种密码原语在密钥管理中的协同流程 对称加密 · 非对称加密 · 哈希协作示意图 非对称加密 RSA / ECC 加密对称密钥 公钥加密 · 私钥解密 对称加密 AES-256-GCM 加密大量数据 同一密钥加解密 哈希函数 SHA-256 完整性校验 密钥派生 / 盐值 凭据 校验 混合加密:非对称保护对称密钥,对称加密数据 哈希用于验证密文完整性与派生工作密钥 典型流程(KMS 密钥封装) ① 生成 DEK ② AES加密数据 ③ SHA256校验 ④ RSA加密DEK DEK = Data Encryption Key(数据加密密钥),由 KMS 或 HSM 内部生成

这张图展示了一个典型的 密钥封装流程:数据用 DEK(对称)加密,DEK 用 KEK(非对称)加密,哈希全程保障完整性。你想想看,这就是 KMS 中最核心的“envelope encryption”思想——每一层密钥都被上一层的密钥保护,只有根密钥存在 HSM 里。

算法选择速查表

用途 推荐算法 密钥长度 注意事项
批量数据加密 AES-256-GCM 256 bit 必须用随机 IV,首选 12 字节
密钥传输/交换 ECDH + HKDF P-256 / P-384 配合盐值进行密钥派生
数字签名 ECDSA P-256 256 bit 性能优于 RSA-2048 约 10 倍
完整性 + 防篡改 SHA-256 + HMAC — HMAC 密钥必须独立于加密密钥
口令存储 scrypt / Argon2id — 绝不能只用 SHA-256 加盐
💡 个人习惯:我在设计 KMS 密钥策略时,会先画一个“密钥拓扑图”——标出哪些密钥是对称的、哪些是非对称的、哈希用在哪里、哪些需要 HSM 保护。动手写代码之前,这张图能帮你提前发现密钥流转漏洞。

最后说一句

对称加密、非对称加密、哈希,不是三个孤立的知识点。它们组合起来才构成安全的密钥管理体系。HSM 本质上就是硬件加速这三种运算,并保证私钥永远不离开安全边界。下一层我们就会讲 HSM 到底是怎么把密钥锁在那一小块芯片里的——嗯,那里可有不少坑等着你。