加密算法与密钥类型:对称、非对称、HMAC

聊密钥边界之前,得先把加密算法和密钥类型理清楚。我在不少合规审计现场见过,团队把 AES 和 RSA 混着用,结果密钥管理一团糟。说白了,每种算法对应哪种密钥,怎么存、怎么轮换,SOC 2 是有明确期望的。你想想看,审计员翻到你的密钥策略,发现 HMAC 密钥和对称加密密钥共用同一套轮换周期……他就得给你开 finding。

对称加密:一把钥匙开一把锁

对称加密,我最常接触的就是 AES-256-GCM。密钥只有一个,加密解密都用它。好处是快,适合大块数据。坏处是——密钥怎么安全地传给对方?在 SOC 2 语境下,对称密钥属于“高敏感资产”,必须硬件安全模块(HSM)或密钥管理服务(KMS)来托管。

我记得有次帮客户做密钥边界评审,他们直接把 AES 密钥写死在配置文件里,还提交到了 Git 仓库……嗯,那是真头疼。后来我们强制要求:对称密钥不能离开 KMS 的边界,应用层只拿密钥的引用(Key ID)。

对称算法典型密钥长度工作模式(SOC 2 推荐)密钥管理要点
AES256 bitGCM(认证加密)密钥必须由 KMS 生成,不能硬编码
ChaCha20256 bitChaCha20-Poly1305移动端常用,需注意随机数重用风险
DES/3DES56/112/168 bit不应使用SOC 2 中已废弃,必须迁移
我的习惯:对称密钥的轮换周期不要超过 90 天。如果对接第三方,使用 KMS 的自动轮换功能。我在项目里还加了一项——轮换后旧密钥至少保留一个观察期(比如 30 天),防止解密历史数据失败。

非对称加密:公钥加密,私钥解密

非对称加密,用 RSA 还是 ECC?我个人意见:新项目一律用 ECDSA 或 Ed25519。RSA 4096 虽然合规上也说得过去,但性能差点,密钥也大。SOC 2 要求保护私钥的机密性和完整性——私钥是“密钥边界”的核心实体,泄露等于全盘皆输。

我曾经在云端部署服务时,发现有人把私钥和代码放在同一个 S3 桶里,桶权限还是公开读的……审计员来的时候,脸都绿了。记住:私钥必须放在独立的密钥存储区域,访问权限最小化,并且开启日志记录。

  • RSA:2048 bit 是底线,4096 更稳妥;加密和签名都用同一对密钥时,要分开用途。
  • ECC:P-256(secp256r1)或 P-384;Ed25519 也受欢迎。
  • 密钥用途分离:签名密钥和加密密钥不能混用。我习惯在 KMS 里创建两个密钥别名,一个签名用,一个加密用。

HMAC:消息完整性的守护者

HMAC 不是加密算法,它是一个基于哈希的消息认证码。用对称密钥来保证数据没被篡改。你可能在 JWT、API 签名里见过它。HMAC 的密钥和对称加密密钥一样需要保护,但有一个关键差异——HMAC 密钥通常不需要解密任何东西,它只用来验证。

所以你会看到一些系统把 HMAC 密钥和 AES 密钥存在同一个 KMS 密钥池里。这其实有风险:审计员会问,如果 HMAC 密钥泄露,攻击者能不能伪造任意 API 请求?

怎么解决?我建议把 HMAC 密钥单独放一个 KMS 区域,而且设置不同的轮换周期(比如 30 天轮换一次)。

特性对称加密密钥非对称私钥HMAC 密钥
用途加密/解密数据签名/解密(取决于用途)消息完整性验证
是否可解密是是(用于加密的私钥)否
泄露后果数据全部暴露身份伪造/数据泄露请求可伪造
典型存储位置KMS / HSMKMS / HSM(不可导出)KMS / 安全配置中心
SOC 2 轮换建议90 天内1 年内30 天内(高频)
避坑指南:我曾经遇到一个项目,HMAC 密钥用 AES-GCM 加密后存数据库。看上去安全,但解密密钥本身又在同一个密钥管理系统里,等于绕了一圈。审计员直接指出:密钥边界没有形成闭环,加密密钥和被加密的密钥在同一个信任域。正确做法:HMAC 密钥应该由 KMS 直接提供,业务代码只调用验证接口,不接触密钥明文。

密钥边界三维度:存储、使用、传输

现在我们把三种密钥类型放在一起看。SOC 2 关注的密钥边界,其实围绕三个维度:

  1. 存储边界:密钥不能离开受控的密钥存储区域。比如 KMS 的硬件安全边界,或者 HSM 的物理边界。
  2. 使用边界:谁、什么进程、通过什么接口可以使用密钥。必须记录每次使用。
  3. 传输边界:密钥在生成、轮换、备份过程中,必须加密传输,且通过 TLS/mTLS 保护。

我见过不少设计漂亮的安全架构,但密钥的备份文件竟然通过 FTP 传输……嗯,这就把边界打破了。你想想看,SOC 2 期望的是每个环节都有明确的边界定义,而且可审计。

密钥边界实施三维度 密钥库(KMS/HSM) 对称密钥 AES-256-GCM 非对称密钥 RSA / ECC / Ed25519 HMAC 密钥 SHA-256 / SHA-384 存储边界 密钥不可脱离受控硬件 使用边界 最小权限 + 操作审计 传输边界 加密通道 + 完整性校验 密钥边界 = 三种密钥类型 × 三个边界维度 任何一条边缺失,审计都会亮红灯

实践中如何选择?

我通常用一张简单的决策表来帮团队决定:

  • 需要加密大量静态数据? → 对称加密(AES-256-GCM),密钥托管在 KMS。
  • 需要数字签名或身份认证? → 非对称加密(Ed25519 或 ECDSA P-256),私钥不可导出。
  • 需要验证 API 请求完整性? → HMAC-SHA256,密钥单独管理,30 天轮换。

关键原则:每种密钥类型对应独立的管理策略,不要“一把尺子量所有”。我在一次 SOC 2 预审中,客户把所有密钥的轮换周期统一设为 180 天,结果对称密钥轮换太慢、HMAC 密钥又轮换太快。审计员建议分别配置。后来我改成了按用途独立定义轮换窗口——对称 90 天,非对称 180 天,HMAC 30 天,就通过了。