很多系统已经使用 AES、RSA 或国密算法加密数据,却仍然把密钥写在配置文件、环境变量甚至代码里。算法没有问题,真正危险的是:谁能拿到密钥、密钥在哪里生成、如何轮换、泄露后如何处置。

KMS 和 HSM 正是为了解决这些问题而出现的。两者经常一起部署,但职责并不相同:

KMS 负责管理密钥,HSM 负责在硬件安全边界内保护和使用密钥。

KMS 与 HSM 的关系

一、KMS 是什么

KMS 全称 Key Management Service/System,密钥管理服务或密钥管理系统

它不是一个单纯保存密钥的数据库,而是一套围绕密码学密钥建立的管理平台,通常包含以下能力:

  • 生成或导入对称密钥、非对称密钥;

  • 启用、禁用、轮换、归档和删除密钥;

  • 提供加密、解密、签名、验签等 API;

  • 通过 IAM、RBAC 或策略控制谁能使用哪把密钥;

  • 记录调用者、时间、来源、操作类型和结果;

  • 管理密钥版本、用途、有效期和删除保护;

  • 与云硬盘、对象存储、数据库、消息队列等服务集成。

从业务应用的角度看,KMS 最重要的价值不是“替你执行一次 AES”,而是把密钥从业务代码中抽离出来,形成统一的权限、审计和生命周期管理边界。

KMS 管理的不是普通密码

KMS 主要管理的是密码学密钥,例如:

  • AES 数据加密密钥;

  • RSA、ECC、SM2 私钥;

  • HMAC 密钥;

  • 证书私钥和签名密钥;

  • 用于保护其他密钥的主密钥。

数据库账号、第三方 API Token、OAuth Client Secret 更接近“凭据”或“机密”。它们通常由 Secrets Manager、Vault KV 等系统管理。不过,今天很多云厂商已经把密钥管理、凭据管理、证书和 HSM 能力整合到同一产品体系中,产品名称与技术边界不一定完全一致。

二、HSM 是什么

HSM 全称 Hardware Security Module,硬件安全模块,国内也常称为密码机。

HSM 是专门执行密码学操作的硬件设备或硬件集群。其核心目标是:

让高价值密钥在受保护的硬件边界内生成、保存和使用,尽量避免明文密钥离开设备。

典型能力包括:

  • 使用硬件随机数生成密钥;

  • 保存根密钥、签名私钥和主密钥;

  • 在设备内部执行加密、解密、签名和验签;

  • 控制密钥是否允许导出;

  • 提供防拆、防篡改和异常清除机制;

  • 支持操作员角色分离、双人双控和审计;

  • 通过 PKCS#11、JCE、CNG 或厂商 SDK 对外提供能力。

HSM 常用于:

  • 银行、支付和银行卡 PIN 系统;

  • CA、电子签章和证书私钥保护;

  • 代码签名、固件签名;

  • TLS 根私钥和高价值签名密钥;

  • 数据库透明加密的根密钥;

  • 政企国密、等保和行业监管场景。

HSM 不等于绝对安全

HSM 能显著提高密钥提取和物理攻击的难度,但它不能解决所有问题。

如果攻击者盗取了一个拥有“签名权限”的应用身份,即使无法导出私钥,也可能持续调用 HSM 完成非法签名。因此,HSM 仍然需要配合:

  • 最小权限;

  • 强身份认证;

  • 调用频率限制;

  • 审批与双人双控;

  • 异常行为监控;

  • 完整审计日志。

硬件保护的是密钥材料,不会自动修复错误的权限设计。

三、KMS 和 HSM 到底是什么关系

KMS 更接近“控制面”,负责策略和生命周期;HSM 更接近“密码运算与根信任层”,负责安全保存和使用密钥。

对比项

KMS

HSM

核心职责

密钥生命周期、权限、审计和 API

硬件级密钥保护与密码运算

产品形态

云服务、软件平台、企业集群

物理设备、板卡或云 HSM 集群

密钥导出

由产品和策略决定

通常支持不可导出密钥

权限管理

IAM、RBAC、策略系统较完整

偏底层角色和设备权限

审计能力

面向业务和租户的调用审计

面向设备和密码操作的审计

扩展与集成

易与云服务、SDK、API 集成

常通过 PKCS#11、JCE、KMIP 接入

运维复杂度

托管 KMS 较低,自建较高

很高,需要设备、集群和灾备管理

典型用户

大多数需要加密的应用

金融、支付、CA、政企和强合规系统

常见组合是:

业务应用 → KMS → HSM 集群

但并非所有 KMS 都为每个客户提供独享 HSM。实际产品可能是:

  1. 软件密钥保护;

  2. 多租户共享 HSM;

  3. 专属 KMS 实例,共享或隔离的 HSM 资源;

  4. 独享 Cloud HSM;

  5. 企业自建 KMS 连接本地 HSM。

因此,看到“KMS 底层使用 HSM”时,还要继续确认:

  • 是否独享硬件;

  • 租户隔离边界是什么;

  • 密钥能否导出;

  • 密钥由谁生成;

  • 认证覆盖的是哪个软硬件版本;

  • 灾备副本由谁控制。

四、密钥层级:为什么不能用一把密钥加密所有数据

企业系统通常不会让 KMS 主密钥直接加密每一条业务数据,而是采用分层密钥结构。

1. 主密钥 CMK / KEK

不同厂商名称略有差异,常见叫法包括:

  • CMK:Customer Master Key;

  • KMS Key:KMS 管理密钥;

  • KEK:Key Encryption Key,密钥加密密钥。

这类密钥通常长期保存在 KMS 或 HSM 中,用于保护下一级数据密钥。

2. 数据密钥 DEK

DEK 全称 Data Encryption Key,用于真正加密业务数据。它通常:

  • 由 KMS 生成;

  • 生命周期较短;

  • 每个文件、对象、租户或数据分片使用不同 DEK;

  • 明文只在应用内存中短暂出现;

  • 持久化时必须先被主密钥加密。

3. 信封加密

这种“主密钥加密数据密钥,数据密钥加密业务数据”的模式称为 Envelope Encryption,信封加密

信封加密流程

数据库或对象存储中通常保存:

  • 业务密文;

  • 被 KMS 主密钥加密后的 DEK;

  • Nonce 或 IV;

  • 算法标识;

  • 主密钥 ID 和版本号;

  • 必要的认证标签和上下文信息。

信封加密有三个直接好处:

  1. 大块数据在本地加密,性能更高;

  2. KMS 不需要接收和保存全部业务数据;

  3. 轮换主密钥时,可以只重新包装 DEK,而不必立即重加密所有业务数据。

五、KMS 管理的是完整生命周期

一把密钥不是创建后永远使用。正规的 KMS 至少需要覆盖以下阶段:

密钥生命周期

生成或导入

密钥可以由 KMS/HSM 生成,也可以通过 BYOK 导入。生成位置决定了谁曾经接触过明文密钥。

启用和使用

密钥必须限定用途。用于签名的密钥不应同时用于数据加密;生产与测试也不应共享同一把密钥。

轮换

轮换通常是生成新版本,新数据使用新版本加密,旧版本继续用于解密历史数据。轮换不等于立即删除旧密钥。

禁用、归档与删除

删除密钥可能导致历史数据永久无法恢复。因此云 KMS 通常提供延迟删除、删除保护或计划删除机制。

泄露处置

密钥泄露后不能只“换一把新密钥”,还应:

  • 停用受影响版本;

  • 查清调用和数据影响范围;

  • 生成新版本;

  • 重加密或重新包装受影响数据;

  • 吊销相关凭据和权限;

  • 保留审计证据。

六、云上常见的五种密钥控制模式

1. 云厂商默认密钥

由云厂商创建和管理,用户只需要为云硬盘、对象存储或数据库开启加密。

优点是简单、成本低;缺点是控制能力有限,通常不适合复杂的应用层字段加密和跨云场景。

2. 客户管理密钥

用户在云 KMS 中创建密钥,自行配置权限、轮换、审计和删除策略。密钥材料仍可能由云厂商的 KMS/HSM 生成和托管。

这是大多数企业云上业务的主流方案。

3. BYOK

BYOK 即 Bring Your Own Key。密钥在客户控制的环境中生成,再通过安全包装导入云 KMS。

它增强了密钥来源控制,但导入后密钥通常仍由云 KMS 托管和使用。BYOK 不等于密钥永远不进入云环境。

4. HYOK / 外部密钥

HYOK 可理解为 Hold Your Own Key。密钥继续保留在客户自己的 HSM 或外部 KMS 中,云服务通过受控接口请求密码运算。

控制权更强,但会带来明显的网络延迟、可用性和运维压力。一旦外部 KMS 不可用,依赖它的云业务可能无法解密数据。

5. 独享 Cloud HSM

客户租用独享的云 HSM 设备或分区,自行管理用户、密钥和密码操作。

它提供更强的隔离和控制,但集成、容量规划、集群、备份和合规责任也更多地落到客户团队身上。

七、KMS 与 HSM 的部署方案

方案一:托管 KMS

适合绝大多数公有云应用。

应用 → 云 KMS API → 云厂商管理的密码模块或 HSM

优势:

  • 上线快;

  • 与云服务深度集成;

  • 自动处理集群、补丁和硬件故障;

  • IAM 和审计能力完整;

  • 可从低成本规格起步。

局限:

  • 依赖云厂商;

  • 跨云迁移成本较高;

  • 密钥控制模型受产品能力限制;

  • 极端场景下难以满足“密钥永不离开本地”。

方案二:专属 KMS 或 HSM 支撑的 KMS

适合对租户隔离、国密、监管认证和吞吐有明确要求的企业。

它通常比普通按量 KMS 贵很多,因为购买的不只是 API,还包括:

  • 专属或隔离的密码资源;

  • 高可用密码机集群;

  • 认证和合规能力;

  • 密钥备份与恢复机制;

  • 更高的吞吐和服务等级。

方案三:独享 Cloud HSM

适合需要直接使用 PKCS#11、JCE 等接口,或者需要完全控制 HSM 用户和密钥的团队。

此时云厂商主要负责硬件托管,客户需要承担更多密码机管理责任。

方案四:自建 KMS

常见做法包括自建 Vault、OpenBao、企业 KMS 或其他密钥服务。

自建方案可以解决多云、混合云和数据主权问题,但它首先是一套软件控制面。除非连接真实 HSM,否则不能获得硬件级密钥保护。

生产级自建至少需要:

  • 3 个或更多高可用节点;

  • 全链路 TLS 和机器身份认证;

  • 严格的策略与管理员权限分离;

  • 独立、不可篡改的审计日志;

  • 密钥和存储快照备份;

  • 定期恢复演练;

  • 解封、根密钥和恢复密钥的离线保管;

  • 版本升级、漏洞修复和应急预案。

因此,自建的主要成本通常不是服务器,而是安全团队和长期运维能力。

方案五:自建 KMS + 本地 HSM

这是控制力最强、同时也最复杂的企业方案:

业务应用 → 企业 KMS 集群 → 本地 HSM 集群

适合金融、支付、政企、CA 和大型集团。它要求团队同时具备应用安全、密码工程、硬件运维、灾备和合规能力。

八、选型时真正应该比较什么

KMS 与 HSM 选型流程

1. 威胁模型

先确定主要防谁:

  • 防止开发者在代码仓库中泄露密钥;

  • 防止数据库备份泄露;

  • 防止单台应用服务器被入侵;

  • 防止云账号管理员滥用权限;

  • 防止物理拆机和密钥提取;

  • 防止内部人员单独完成高风险操作。

如果只是解决“密钥不能写在代码里”,托管 KMS 已经足够;如果需要抵御物理攻击和高权限管理员导出根密钥,则需要评估 HSM、双人双控和不可导出密钥。

2. 合规要求

需要确认的不是“产品宣传说支持合规”,而是:

  • 认证标准和等级;

  • 认证证书是否仍有效;

  • 认证覆盖的具体型号、固件和部署模式;

  • 是否支持所需国密算法;

  • 密钥生成、备份、销毁是否满足行业规则;

  • 是否要求密码机双机或多机集群。

FIPS 140-3 针对密码模块的设计和安全边界提出要求,但一个通过认证的模块不代表整个业务系统天然安全。权限、网络、应用和流程仍然需要单独设计。

3. 性能和延迟

不要让应用为每一条大数据都远程调用 KMS 加密。更合理的方式是:

  • 使用信封加密;

  • KMS 只处理小体积 DEK;

  • 大数据由应用或存储服务本地加密;

  • 在可控时间内短暂缓存 DEK;

  • 对签名和解密接口设置并发与限流。

选型时要测试:

  • 单次调用延迟;

  • 峰值 QPS;

  • 批量接口;

  • 跨可用区、跨地域和跨云网络延迟;

  • KMS 故障时业务的降级行为。

4. 可用性和灾难恢复

KMS 一旦不可用,系统可能仍能写入密文,却无法解密旧数据,甚至无法启动。

必须确认:

  • 是否支持多可用区;

  • HSM 是否为集群;

  • 密钥是否有受保护的备份;

  • 跨地域灾备如何实现;

  • 密钥删除后能否恢复;

  • 灾备切换是否需要人工审批;

  • 是否定期做过真实恢复演练。

5. 集成能力

重点看:

  • SDK、REST API、PKCS#11、JCE、KMIP 等接口;

  • 是否与数据库、对象存储、Kubernetes 和 CI/CD 集成;

  • 是否支持机器身份而不是长期 AccessKey;

  • 是否支持密钥导入、导出或迁移;

  • 审计日志能否接入 SIEM;

  • 是否支持自动轮换和版本选择。

6. 成本模型

不要只比较“每月实例费”。KMS/HSM 的总成本通常包括:

  • 密钥数量;

  • API 调用次数;

  • 专属 KMS 实例;

  • HSM 设备或分区;

  • 跨地域和跨云网络;

  • 日志存储;

  • 集成开发;

  • 备份与灾备;

  • 安全运维和合规审计。

普通按量 KMS 可能很便宜,真正昂贵的通常是专属实例、独享 HSM 和监管级高可用方案。

九、不同场景的推荐方案

场景

推荐方案

是否需要 HSM

说明

个人博客、小型项目

云默认密钥或按量 KMS

通常不需要

优先降低复杂度,不建议自建 KMS 集群

普通企业 SaaS

客户管理密钥 + 信封加密

使用云 KMS 的底层保护即可

做好 IAM、审计、轮换和删除保护

多租户敏感数据

每租户或每业务域分离密钥

视风险决定

避免所有租户共享一把密钥

混合云、多云

企业 KMS/Vault 控制面,必要时连接 HSM

可选

重点评估网络、可用性和厂商退出方案

金融、支付、CA

专属 KMS + 独享 HSM

通常需要

需要双人双控、密钥仪式、审计与灾备

政企国密项目

支持国密和相应认证的 KMS/HSM

通常需要

必须核对认证型号和部署边界

代码签名、根证书私钥

HSM 或高等级托管签名服务

强烈建议

私钥价值高,通常不应允许明文导出

对大多数中小团队的实际建议

一个稳妥且不过度设计的起点是:

  1. 使用云厂商托管 KMS;

  2. 为不同环境、业务域建立独立客户管理密钥;

  3. 使用信封加密,不直接让主密钥加密大块数据;

  4. 应用通过实例角色、工作负载身份等短期身份访问 KMS;

  5. 开启审计日志、告警、删除保护和自动轮换;

  6. 定期测试历史密文和备份能否恢复;

  7. 只有在合规或威胁模型明确要求时,再升级到专属 KMS 或独享 HSM。

十、最容易踩的坑

把密钥写进代码或镜像

即使仓库是私有的,也可能通过日志、构建缓存、镜像层和离职人员账号泄露。

把“环境变量”当作最终密钥系统

环境变量比硬编码好,但进程、调试工具、崩溃转储和运维平台仍可能读取它。环境变量适合传递短期凭据,不应成为长期主密钥的最终归宿。

一把密钥覆盖所有系统

一把密钥泄露会扩大影响范围,也无法做到按业务、租户和环境撤销权限。

只轮换密钥,不保存版本信息

如果密文没有保存密钥 ID 和版本号,轮换后可能无法判断应该用哪个版本解密。

轮换后立即删除旧密钥

新数据已经使用新密钥,不代表历史数据已经完成重加密。删除旧密钥可能造成永久数据丢失。

认为使用 HSM 就不需要权限控制

攻击者不一定要导出私钥,只要能够调用签名或解密接口,也可能造成严重后果。

没有恢复演练

“已经备份”不代表“能够恢复”。密钥系统的灾备必须定期验证,否则真正故障时才会发现备份不可用、恢复密钥丢失或权限流程不完整。

十一、落地检查清单

在生产环境上线前,至少确认以下事项:

  • [ ] 密钥未硬编码在源码、镜像和普通配置文件中;

  • [ ] 生产、测试和开发环境使用不同密钥;

  • [ ] 加密、签名和 HMAC 使用不同用途的密钥;

  • [ ] 应用使用短期身份访问 KMS;

  • [ ] 权限精确到密钥和操作类型;

  • [ ] 使用信封加密处理大块数据;

  • [ ] 密文保存密钥 ID、版本、算法和 Nonce;

  • [ ] 开启密钥删除保护和操作审计;

  • [ ] 建立轮换、泄露处置和重加密流程;

  • [ ] 配置 KMS/HSM 高可用和灾备;

  • [ ] 做过密钥和业务数据的联合恢复演练;

  • [ ] 对 HSM 认证范围和部署型号完成核验。

总结

KMS 和 HSM 不是互相替代的产品:

  • KMS 解决“如何管理密钥”:生命周期、权限、审计、轮换和 API;

  • HSM 解决“密钥在哪里安全地生成和使用”:硬件隔离、防篡改和不可导出;

  • 信封加密解决“如何低成本地加密大量业务数据”

  • 合适的选型取决于威胁模型和合规要求,而不是一味追求最贵的硬件。

对大多数系统而言,托管 KMS 加信封加密已经是安全性、成本和维护难度之间比较合理的平衡。只有当业务明确涉及高价值私钥、金融支付、CA、政企国密或严格监管时,才有必要进一步选择专属 KMS、独享 HSM,甚至自建 KMS 与 HSM 集群。

参考资料

  1. 阿里云:密钥管理服务 KMS 文档

  2. 华为云:密码安全中心 DEW 文档

  3. 腾讯云:密钥管理系统 KMS 文档

  4. 腾讯云开发者社区:企业级密钥管理深度实践

  5. NIST FIPS 140-3:Security Requirements for Cryptographic Modules

  6. NIST SP 800-57 Part 1 Rev.5:Recommendation for Key Management

  7. HashiCorp Vault:Transit Secrets Engine

  8. OASIS:Key Management Interoperability Protocol

腾讯云开发者社区文章属于作者实践分享,适合用于扩展选型思路;涉及具体产品能力、认证和价格时,应以各厂商最新官方文档与合同为准。