Skip to content

数据加解密体系的设计与落地解决方案研究:以信封加密、密钥管理与 Vault/KMS 实现为中心

概览

系统研究企业数据加解密体系,覆盖对称与非对称加密、认证加密、信封加密、根密钥、KEK、DEK、密钥存储、轮转、本地与远程加密、HashiCorp Vault Transit、云 KMS、HSM、BYOK、SDK 设计与审计控制。

摘要

数据加解密是信息系统中保护数据机密性、完整性与访问边界的重要技术组成。现代企业系统通常同时面临静态数据保护、传输过程保护、应用层敏感字段保护、密钥生命周期管理、权限隔离、审计追踪与合规落地等需求。根据 NIST、AWS、Google Cloud、Microsoft Azure 与 HashiCorp Vault 等官方文档,业界通用实践并不是使用单一密钥直接加密所有业务数据,而是采用分层密钥管理体系,其中信封加密是云服务、KMS、HSM 与 Vault Transit 等系统广泛采用的标准模式。信封加密通过数据密钥加密业务数据,再通过密钥加密密钥或主密钥加密数据密钥,从而实现数据加密操作与密钥保护操作的分离。本文围绕常见加解密方式、信封加密的密钥层级、根密钥、主密钥、数据密钥的概念及生命周期、密钥存储与轮转、远程加密与本地加密差异、HashiCorp Vault 标准实现以及云厂商 KMS 实现模式展开分析,并提出面向企业系统的落地设计框架。

关键词:数据加密;信封加密;密钥管理;KMS;HashiCorp Vault;数据密钥;主密钥;密钥轮转


1 引言

随着企业系统中用户数据、交易数据、身份数据、日志数据和业务配置数据规模持续增长,数据安全保护从单点算法选择逐步演进为“算法、密钥、权限、审计、轮转、隔离、可恢复性”协同设计的问题。NIST SP 800-57 将密钥管理定义为密码系统中的核心管理活动,其内容包括密钥材料的生成、保护、使用、分发、存储、轮转、恢复与销毁等多个环节 [1]。因此,企业数据加解密方案不应仅讨论“使用何种算法”,还应明确密钥如何生成、如何存储、如何授权、如何轮转、如何审计以及如何在故障或泄露场景下恢复安全状态。

从算法层面看,AES 是 NIST FIPS 197 指定的对称分组密码标准,可用于保护电子数据 [2]。在现代系统中,AES 通常不会单独使用,而是结合特定工作模式使用。NIST SP 800-38D 规定了 GCM 与 GMAC,其中 GCM 属于认证加密模式,可同时提供机密性和完整性保护 [3]。从工程实践看,AES-GCM、KMS、HSM、Vault Transit、云厂商托管密钥、客户端加密 SDK 等共同组成了企业加解密落地体系。

在大规模数据场景中,直接使用根密钥或主密钥加密业务数据并不符合通用工程实践。AWS KMS、Google Cloud KMS、Azure 加密模型与 HashiCorp Vault 均采用或支持多层密钥结构。其核心思想是:使用短生命周期或细粒度的数据密钥加密具体业务数据,使用更高层级、更受保护的密钥加密数据密钥。该模式即信封加密 [4][5][6]。


2 常见加解密方式

2.1 对称加密

对称加密使用同一个密钥完成加密与解密。AES 是现代系统中最常见的对称加密算法之一。FIPS 197 指出,AES 是一种对称分组密码,可对信息进行加密和解密,并将明文转换为不可理解的密文 [2]。在工程落地中,AES 常与 GCM 模式结合使用。GCM 属于认证加密模式,可以同时提供数据机密性和认证保护 [3]。

对称加密适用于大批量数据加密场景,例如数据库字段加密、对象存储文件加密、日志内容加密、缓存数据加密、备份文件加密等。其主要工程特征是加解密性能较高,适合本地处理大数据块;其关键约束是密钥必须被严格保护,因为获得同一密钥的主体可以同时执行加密和解密。

2.2 非对称加密

非对称加密使用公钥和私钥组成密钥对。公钥通常用于加密或验签,私钥用于解密或签名。非对称加密在密钥分发、身份认证、数字签名、跨主体数据共享等场景中具有工程价值。但相较于对称加密,非对称加密通常不直接用于大规模业务数据加密,而是用于加密较小的数据密钥、进行密钥交换或完成签名验签操作。

在信封加密体系中,业务数据通常由对称数据密钥加密,而数据密钥可以由对称 KEK、非对称公钥、HSM 托管密钥或 KMS 托管密钥进行包装。AWS Encryption SDK 官方文档指出,信封加密可以结合对称与非对称算法:数据使用对称加密,数据密钥可使用适合包装密钥的对称或非对称算法加密 [7]。

2.3 哈希、HMAC 与加密的边界

哈希函数并不是加密算法。加密操作要求密文在授权条件下可以被还原为明文,而哈希函数是单向摘要计算,通常用于完整性校验、索引、去重、签名输入或不可逆标识生成。HMAC 是基于密钥的消息认证码,用于验证消息完整性和来源真实性,但同样不用于还原明文。

在企业敏感数据治理中,哈希适用于不需要还原明文的场景,例如唯一性匹配、不可逆指纹、密码摘要存储等;加密适用于需要在授权场景下恢复明文的场景,例如证件号、手机号、邮箱、支付信息、业务配置密钥等。因此,数据治理设计中应明确区分“可逆加密”“不可逆哈希”“脱敏展示”和“访问控制”四类能力。

2.4 认证加密

认证加密用于同时保护数据机密性和完整性。AES-GCM 是企业系统中常见的认证加密方案之一。NIST SP 800-38D 将 GCM 定义为认证加密算法,同时定义了 GMAC 用于消息认证 [3]。在工程实现中,AES-GCM 输出通常包含密文、nonce 或 IV、认证标签 tag 以及可选的关联数据 AAD。AAD 不被加密,但参与认证计算,适合绑定租户 ID、表名、字段名、版本号、业务上下文等信息。


3 信封加密模型

3.1 信封加密的基本定义

信封加密是指使用一个密钥加密数据,再使用另一个密钥加密前一个密钥的密钥分层技术。AWS KMS 官方文档将信封加密定义为:使用数据密钥加密明文数据,再使用另一个密钥加密该数据密钥 [4]。Google Cloud KMS 官方文档也将其描述为“用一个密钥加密另一个密钥”的过程 [6]。

信封加密的基本结构如下:

  1. 生成数据密钥 DEK。
  2. 使用 DEK 对业务明文数据执行本地加密,生成业务密文。
  3. 使用主密钥、KEK 或 KMS Key 对 DEK 进行加密包装,生成 encrypted DEK。
  4. 将业务密文、encrypted DEK、密钥版本、算法标识、nonce/IV、tag、AAD 元数据一起存储。
  5. 解密时,先调用 KMS、Vault 或本地密钥系统解开 encrypted DEK,再使用 DEK 解密业务密文。

该结构将大体量数据加密与高价值密钥保护解耦。业务数据由细粒度 DEK 加密,DEK 由集中式高安全等级密钥保护。Google Cloud KMS 文档明确指出,Cloud KMS 被设计用于管理 KEK,单个 KEK 可以保护多个 DEK,从而支持每个数据对象使用独立 DEK,同时避免中央密钥服务中保存过多密钥 [6]。

3.2 信封加密的工程数据结构

在数据库字段、文件对象或消息加密场景中,推荐将加密结果封装为结构化 Envelope Ciphertext。一个典型结构如下:

json
{
  "ciphertext": "base64(data ciphertext)",
  "encryptedDataKey": "base64(wrapped DEK)",
  "keyId": "kms/vault/key identifier",
  "keyVersion": "version number or key material version",
  "algorithm": "AES-256-GCM",
  "iv": "base64(96-bit nonce)",
  "tag": "base64(auth tag)",
  "aad": {
    "tenantId": "tenant identifier",
    "resourceType": "table or object type",
    "field": "encrypted field name"
  }
}

该结构中,业务系统持久化的是密文与被加密的数据密钥,不持久化明文 DEK。Google Cloud KMS 文档明确给出信封加密流程:生成本地 DEK,使用 DEK 加密数据,使用 KEK 包装 DEK,并存储加密数据和被包装的 DEK,同时明确警告不得存储明文 DEK [6]。AWS KMS GenerateDataKey 文档也要求在使用明文数据密钥完成本地加密后,从内存中擦除明文数据密钥,并将加密后的数据密钥与密文一起保存 [5]。


4 信封加密中的密钥层级

4.1 根密钥

根密钥是密钥体系中最高层级或接近最高层级的密钥材料。AWS KMS 文档指出,在多层密钥链中,最终必须有一个保持可用于解密其他密钥和数据的顶层明文密钥,该顶层明文 KEK 被称为 root key;AWS KMS 中的 root key 由 KMS 保护,未加密状态下不会离开 AWS KMS 的硬件安全模块 [4]。

在 Vault 中,根密钥的概念体现为 Vault 启封过程中的 root key。Vault 官方文档说明,Vault 使用 keyring 中的 encryption key 加密大多数数据;为了保护 encryption key,Vault 使用 root key 加密该 encryption key;root key 又由 unseal key 加密并随其他 Vault 数据存储。Vault 启封的本质是获得 root key,以便解密 keyring [11]。

根密钥的作用不是直接加密业务数据,而是用于保护下一层密钥材料或解开内部密钥环。其作用时间通常较长,但实际暴露窗口应极短。在 HSM/KMS 模型中,根密钥通常位于密码边界内,业务应用不能直接读取。在 Vault Shamir Seal 模型中,root key 需要通过达到阈值数量的 unseal key shares 才能恢复;在 Auto Unseal 模型中,root key 的解密责任委托给云 KMS 或 HSM 等受信服务 [11]。

4.2 主密钥、KEK 与 Wrapping Key

主密钥在不同产品中名称不同。在 AWS KMS 中,KMS key 用于保护数据密钥;在 Google Cloud KMS 与 Azure 模型中,KEK 用于包装 DEK;在 AWS Encryption SDK 中,wrapping key 或 master key provider 用于加密数据密钥 [4][6][7][12]。

主密钥的主要职责是加密、解密或包装数据密钥,而不是直接处理大体量业务数据。Google Cloud KMS 文档指出,DEK 由 KEK 加密,也称为 wrapped;KEK 应集中存储并定期轮转 [6]。Azure 文档指出,KEK 用于通过信封加密加密 DEK,且 KEK 不离开 Key Vault,由此可以控制数据密钥并实现访问主体隔离 [12]。

主密钥的作用时间通常长于数据密钥。其生命周期以月、季度、年或合规周期为单位进行管理,并通过版本化机制支持旧密文解密。AWS KMS 文档说明,KMS key 轮转后,加密新数据时使用当前密钥材料,解密旧数据时 AWS KMS 自动选择加密时使用的密钥材料版本 [9]。因此,主密钥轮转通常不要求立即重写所有历史业务密文,但需要保存旧版本密钥材料以支持历史数据解密。

4.3 数据密钥

数据密钥是直接加密业务数据的密钥。Google Cloud KMS 文档将用于加密数据本身的密钥称为 Data Encryption Key,即 DEK [6]。Azure 文档也将 DEK 定义为用于加密分区或数据块的对称 AES-256 密钥 [12]。AWS KMS GenerateDataKey 接口会返回一个明文数据密钥和一个由指定 KMS key 加密后的数据密钥副本,应用使用明文数据密钥在 KMS 外部加密数据,再保存 encrypted data key [5]。

数据密钥的作用时间应短于主密钥。Google Cloud KMS 建议每次写入数据时生成新的 DEK,并指出这种模式下不需要轮转 DEK;同时建议不要使用同一个 DEK 加密两个不同用户的数据 [6]。AWS Encryption SDK 也说明,除非使用数据密钥缓存,否则每条消息使用唯一数据密钥加密 [7]。

从工程角度看,DEK 的常见粒度包括:

  1. 每条消息一个 DEK。
  2. 每个文件一个 DEK。
  3. 每个对象一个 DEK。
  4. 每个数据库行或敏感字段组一个 DEK。
  5. 每个租户、分区或数据块一个 DEK。

DEK 粒度越细,单个密钥泄露影响范围越小,但 encrypted DEK 数量、KMS 调用量和元数据存储成本越高。DEK 粒度越粗,加解密成本越低,但密钥复用范围更大。实际系统应根据数据敏感等级、访问频率、密文体量、租户隔离要求和审计要求确定粒度。


5 密钥存储最佳实践

5.1 密钥与数据分离

密钥存储的核心原则是密钥与密文分离。业务数据库可以保存业务密文和 encrypted DEK,但不应保存明文 DEK、主密钥或根密钥。AWS KMS 文档说明,encrypted data key 可以与 encrypted data 一起安全保存,因为数据密钥本身已经被另一个密钥保护 [4][5]。Google Cloud KMS 也明确要求不要存储明文 DEK [6]。

5.2 高层级密钥集中托管

主密钥、KEK、wrapping key 应由集中式密钥管理系统托管,例如 KMS、HSM、Vault 或云厂商 Key Vault。Google Cloud KMS 建议集中存储 KEK;Azure Key Vault 提供密钥、机密与证书管理能力,Premium 层支持由 FIPS 140-3 Level 3 验证的 HSM 保护密钥 [6][12]。AWS Encryption SDK 文档也指出,可以使用 AWS KMS、HSM 或其他密钥管理工具保护 wrapping key [7]。

集中托管的价值在于统一访问控制、统一审计、统一密钥版本管理、统一禁用与删除策略、统一轮转策略。对于企业系统,业务服务只获得“使用密钥”的权限,不获得“导出密钥”的权限。高层级密钥不应出现在应用配置文件、环境变量、数据库、代码仓库、日志、构建产物和普通配置中心中。

5.3 访问控制与最小权限

密钥访问应基于最小权限原则。应用服务通常只需要 EncryptDecryptGenerateDataKey 或 Vault Transit 某个 named key 的加解密权限,不应具备密钥删除、密钥导出、密钥策略修改、root token、unseal key 管理等权限。Vault Transit 文档说明,可以通过 ACL 限制可信操作员管理 named keys,同时限制应用只能使用其所需 named keys 执行加密或解密 [10]。

企业落地时,应将权限拆分为以下角色:

  1. 密钥管理员:创建、禁用、轮转、删除密钥,不接触业务明文。
  2. 应用调用方:调用加密、解密或生成数据密钥接口,不管理密钥策略。
  3. 审计人员:查看密钥使用日志、访问记录与变更记录,不执行加解密。
  4. 安全管理员:配置密钥策略、审批高危操作、处理泄露事件。
  5. 平台运维人员:维护 KMS/Vault/HSM 服务高可用,不直接接触业务数据。

5.4 明文密钥内存管理

明文 DEK 只应在加解密计算期间短暂存在于内存中。AWS KMS GenerateDataKey 文档要求应用在使用明文数据密钥完成加密或解密后,从内存中擦除明文数据密钥 [5]。在 Java、Go、Python 等运行时中,完全可靠的内存擦除受垃圾回收、对象复制和运行时优化影响,因此工程实现中应尽量使用 byte array、限制作用域、避免字符串化、避免日志打印、避免异常对象携带密钥内容,并减少明文密钥在应用中的驻留时间。

5.5 审计与密钥标识

密文结构中应保存 keyIdkeyVersionalgorithmcreatedAtaad 等元数据。该信息用于定位解密所需密钥、支持密钥轮转、支持审计追踪、支持算法升级。AWS Encryption SDK 的 encrypted message 包含 encrypted data keys、算法标识、可选 encryption context 和签名等元数据 [7]。这说明成熟 SDK 并不只返回裸密文,而是返回可携带解密上下文的结构化密文对象。


6 密钥生命周期与周期轮转

6.1 密钥生命周期

NIST SP 800-57 将密钥管理覆盖到密钥材料生命周期中的多个管理问题,包括生成、使用、保护、存储、轮换、恢复与销毁等 [1]。企业系统中的密钥生命周期通常包括:

  1. 密钥创建:由 KMS、HSM、Vault 或合规随机源生成。
  2. 密钥启用:绑定用途、权限、算法、租户、环境与业务域。
  3. 密钥使用:用于 encrypt、decrypt、wrap、unwrap、sign、verify 等操作。
  4. 密钥轮转:生成新版本密钥材料或新 named key。
  5. 密钥停用:停止用于新数据加密,但保留旧数据解密能力。
  6. 密钥禁用:临时禁止使用,用于风险控制。
  7. 密钥销毁:在确认无历史数据依赖后删除密钥或密钥材料。
  8. 密钥恢复:在备份、灾备或跨地域场景中恢复密钥使用能力。

6.2 DEK 轮转

如果采用每条消息、每个对象或每次写入生成新 DEK 的模式,DEK 本身不需要周期性轮转。Google Cloud KMS 明确建议每次写入数据时生成新的 DEK,并指出这种方式意味着不需要轮转 DEK [6]。在该模式下,DEK 生命周期通常与对应密文对象绑定:生成后立即用于加密业务数据,随后只保存 encrypted DEK;解密时短暂恢复明文 DEK,使用后擦除。

6.3 KEK/主密钥轮转

KEK 或主密钥应定期轮转,并在怀疑泄露或安全事件后轮转。Google Cloud KMS 建议 KEK 定期轮转,并在疑似事件后轮转 [6]。AWS KMS 支持 customer managed keys 的可选自动轮转与按需轮转;AWS managed keys 每年自动轮转 [9]。AWS KMS 还会保留旧版本密钥材料,以便解密使用旧密钥材料加密的数据 [9]。

主密钥轮转后有两种处理模式:

  1. 透明轮转:密钥 ID 不变,密钥材料版本变化。新加密数据使用最新版本,旧数据解密时由 KMS 自动选择历史版本。
  2. 显式重包装:生成新 KEK 后,将旧 encrypted DEK 解开,再使用新 KEK 重新包装 DEK,业务数据密文不变。

第一种模式对业务改造较小,依赖 KMS 或 Vault 的版本管理能力。第二种模式适用于跨 KMS 迁移、密钥泄露恢复、租户拆分、合规要求变更等场景。

6.4 Vault Transit 轮转

HashiCorp Vault Transit 支持 named key 的底层加密密钥轮转。Vault Transit 文档说明,轮转操作会生成新的 encryption key 并加入该 named key 的 keyring;Vault 还建议即使没有泄露事件,也应周期性轮转加密密钥。对于 AES-GCM key,Vault 文档建议在单个 key version 执行约 2^32 次加密之前轮转,并要求操作人员根据加密速率估算轮转频率 [10]。

6.5 根密钥与 Vault 内部密钥轮转

Vault 内部密钥体系还包括 unseal key、root key、backend encryption key 等。Vault 官方文档说明,Vault 使用 keyring 中的 encryption key 加密大多数数据,使用 root key 解密 keyring,而 root key 本身需要 unseal key 解密 [11]。Vault 支持 rekey 与 rotate 操作,用于更新 unseal key、root key 或 backend encryption key。Vault 的 security barrier 使用 AES-256-GCM 加密写入存储后端的数据,并为每个加密对象随机生成 nonce [11]。


7 远程加密与本地加密

7.1 远程加密

远程加密是指应用将明文数据发送到 KMS、Vault 或 Key Vault,由远程服务执行加密并返回密文。Vault Transit 属于典型的远程加密服务。HashiCorp 官方文档将 Transit secrets engine 描述为 cryptography as a service 或 encryption as a service;Vault 不存储发送到 Transit 的业务数据,而是处理加密、解密、签名、验签、哈希、HMAC 和随机数生成等密码操作 [10]。

远程加密的客观特征包括:

  1. 明文数据需要传输到远程加密服务。
  2. 密钥不离开 KMS/Vault/HSM。
  3. 加解密行为可以集中审计。
  4. 业务应用无需实现底层密码细节。
  5. 加解密延迟受网络、服务可用性、限流策略和远程服务性能影响。
  6. 大对象直接远程加密会增加网络传输量与服务端计算压力。

远程加密适合小体量敏感字段、统一密码服务、跨语言统一实现、需要强审计的系统,以及应用团队不直接管理密码算法细节的场景。

7.2 本地加密

本地加密是指应用在本地进程中使用 DEK 加密业务数据,仅将 DEK 的生成、包装、解包或保护委托给 KMS/Vault/HSM。AWS KMS GenerateDataKey 与 Google Cloud KMS Envelope Encryption 均属于此模式:应用获取或生成 DEK,在本地加密数据,再通过 KMS key 或 KEK 包装 DEK [5][6]。

本地加密的客观特征包括:

  1. 大体量业务数据不需要传输到 KMS。
  2. KMS 只处理小体量数据密钥或 encrypted DEK。
  3. 加解密性能主要由应用本地 CPU 和密码库决定。
  4. 应用需要正确实现 nonce、AAD、tag、密文格式、明文密钥内存管理等细节。
  5. 明文 DEK 会短暂出现在应用内存中。
  6. 适合大文件、大对象、高吞吐数据库字段、日志和消息场景。

AWS KMS FAQ 指出,AWS KMS 支持最多 4 KB 数据直接加密,但信封加密可以带来性能收益,因为直接加密需要将数据通过网络传输到 KMS,而信封加密只需要通过网络传输较小的数据密钥 [8]。这说明在大数据量场景中,本地数据加密加远程密钥包装是更常见的工程模型。

7.3 远程加密与本地加密对比

维度远程加密本地加密
数据是否离开应用明文业务数据发送到 KMS/Vault业务数据不发送到 KMS/Vault
密钥暴露密钥不离开服务端明文 DEK 短暂出现在应用内存
性能受网络与服务限流影响主要受本地 CPU 与密码库影响
审计集中审计加解密请求KMS 审计密钥操作,本地加密需应用补充审计
适用数据量小字段、小文本、统一密码服务大对象、大文件、高吞吐数据
实现复杂度应用侧较低应用需处理密码工程细节
可用性依赖强依赖远程服务加密时依赖较低,生成/解包 DEK 时依赖 KMS
典型实现Vault Transit encrypt/decryptAWS GenerateDataKey + AES-GCM

从企业落地角度,远程加密适合作为统一敏感字段加密服务,本地加密适合作为高吞吐数据加密基础能力。两者不是替代关系,而是应按照数据体量、访问频率、密钥隔离要求和审计要求共同使用。


8 HashiCorp Vault 的标准实现

8.1 Vault Transit

Vault Transit secrets engine 是 Vault 提供的加密即服务能力。官方文档说明,Transit 处理传输中数据的密码函数,不存储发送给该 secrets engine 的数据;它可被视为 cryptography as a service 或 encryption as a service [10]。其主要用途是让应用将加密后的数据存储在自己的主数据库中,同时将加解密能力交给 Vault 操作员统一管理 [10]。

Vault Transit 的基本落地流程如下:

  1. 启用 Transit secrets engine。
  2. 创建 named encryption key。
  3. 应用调用 /transit/encrypt/{key} 对明文加密。
  4. 应用将返回的 Vault ciphertext 保存到业务数据库。
  5. 解密时应用调用 /transit/decrypt/{key},由 Vault 返回明文。
  6. 使用 ACL 限制不同应用只能访问其授权 named key。
  7. 定期调用 rotate 生成新 key version。
  8. 对历史密文按需执行 rewrap。

Vault Transit 适合应用侧不希望直接处理 DEK、nonce、tag、算法选择和密钥版本的场景。它把密码工程复杂度集中到 Vault,由 Vault 统一管理 named key、版本、权限和审计。

8.2 Vault Transit 与信封加密

Vault Transit 既可以作为远程加密服务,也可以支持数据密钥生成,用于信封加密。官方文档说明,datakey generation 允许进程请求指定长度的高熵密钥,该密钥由 named key 加密返回;通常也可返回明文,以便立即使用,也可以禁用明文返回以满足审计要求 [10]。这与 AWS KMS GenerateDataKey 模式相似:Vault 负责生成和包装 DEK,应用使用明文 DEK 本地加密业务数据,并保存 encrypted DEK。

因此,Vault 的两种典型使用方式为:

  1. 远程加密模式:业务明文发给 Vault Transit,由 Vault 返回密文。
  2. 信封加密模式:Vault 生成或包装 DEK,业务应用本地使用 DEK 加密数据。

8.3 Vault 内部安全屏障

Vault 的内部存储后端按不可信设计处理。Vault 官方安全模型说明,Vault 对所有发往存储后端的请求使用 security barrier,所有离开 Vault 的数据都会被 AES-256-GCM 自动加密,并使用 96-bit nonce,nonce 为每个加密对象随机生成 [11]。这意味着即使 Vault 使用外部存储后端,存储后端也不能直接读取 Vault 内部明文数据。

Vault Seal/Unseal 文档进一步说明,Vault 大多数数据由 keyring 中的 encryption key 加密;encryption key 由 root key 加密;root key 由 unseal key 加密。默认 Shamir Seal 会将 unseal key 分割为多个 shares,并要求达到阈值数量后重构 unseal key,以解开 root key [11]。该设计形成了 Vault 内部的分层密钥保护模型。


9 业界标准实现模式

9.1 云 KMS 模式

AWS KMS、Google Cloud KMS、Azure Key Vault 均提供密钥集中托管能力。AWS KMS 的 GenerateDataKey 接口返回明文数据密钥和由 KMS key 加密的数据密钥,应用可在 KMS 外部使用明文数据密钥加密数据,并保存 encrypted data key [5]。Google Cloud KMS 建议本地生成 DEK,使用 DEK 加密数据,再使用 Cloud KMS 中的 KEK 包装 DEK,并保存 encrypted data 与 wrapped DEK [6]。Azure 静态数据加密模型使用 envelope encryption,其中 DEK 加密分区或数据块,KEK 加密 DEK,KEK 不离开 Key Vault [12]。

云 KMS 模式的标准结构是:

  1. KMS/HSM 托管主密钥或 KEK。
  2. 应用使用 SDK 调用 KMS 生成或包装 DEK。
  3. 应用在本地使用 DEK 执行业务数据加密。
  4. 业务库保存密文、encrypted DEK、keyId、keyVersion、algorithm、AAD。
  5. KMS 负责主密钥保护、访问控制、审计和轮转。
  6. 应用负责业务密文存储、DEK 内存清理和密文格式兼容。

9.2 客户端加密 SDK 模式

AWS Encryption SDK 属于客户端信封加密库。官方文档说明,该 SDK 使用信封加密保护数据:每条消息使用唯一数据密钥加密,然后使用指定 wrapping key 加密该数据密钥;encrypted message 中包含 encrypted data、encrypted data keys、algorithm ID、可选 encryption context 和数字签名 [7]。这种模式降低了业务系统自行设计密文格式的复杂度。

客户端加密 SDK 适合以下场景:

  1. 多语言服务需要统一密文格式。
  2. 应用需要本地高性能加解密。
  3. 需要自动处理 data key、wrapping key、algorithm suite、encryption context。
  4. 需要支持多个 wrapping keys 包装同一个 data key,以实现跨账号、跨区域或多接收方解密。

9.3 HSM 与 BYOK 模式

HSM 用于在硬件安全边界内生成、保存和使用高价值密钥。Azure Key Vault Premium 层提供 HSM-protected keys;AWS KMS 与 CloudHSM、Google Cloud HSM 等也提供硬件保护能力 [12]。BYOK 场景中,企业可以将自有密钥材料导入云 KMS 或 HSM,但导入密钥材料的轮转、备份、过期和删除责任需要明确。

HSM/BYOK 适合对密钥控制权、合规审计、硬件保护等级和跨云密钥治理要求较高的组织。其工程约束是部署、运维、灾备、可用性和成本复杂度高于普通托管 KMS。


10 企业落地方案设计

10.1 总体架构

企业数据加解密平台可采用如下架构:

  1. 密钥管理层:KMS、Vault、HSM 或云 Key Vault,负责 root key、KEK、named key、key version、访问控制、审计与轮转。
  2. 加密 SDK 层:封装 AES-GCM、DEK 生成、KMS/Vault 调用、encrypted DEK 管理、密文格式、AAD、异常处理与指标。
  3. 业务接入层:数据库字段加密、对象存储加密、消息加密、配置加密、日志敏感字段加密。
  4. 治理层:密钥审批、权限审批、轮转策略、审计报表、密钥使用基线、异常调用告警。
  5. 灾备层:密钥备份、跨区域复制、历史版本保留、密钥恢复演练、密文兼容测试。

10.2 推荐加密流程

对于大多数企业业务数据,推荐采用信封加密:

  1. 服务启动时加载加密 SDK 配置,不加载任何明文主密钥。
  2. 写入数据时,SDK 为每条记录或对象生成 DEK。
  3. SDK 使用 AES-256-GCM 加密业务明文。
  4. SDK 调用 KMS/Vault 使用 KEK 包装 DEK。
  5. SDK 将密文、encrypted DEK、keyId、keyVersion、iv、tag、algorithm、aad 一并返回。
  6. 业务系统只保存结构化密文对象。
  7. 读取数据时,SDK 根据 keyId 和 keyVersion 调用 KMS/Vault 解开 encrypted DEK。
  8. SDK 使用 DEK 本地解密业务密文。
  9. SDK 清理明文 DEK,并记录审计指标。

10.3 密钥命名与隔离

密钥命名应包含环境、业务域、数据等级、用途和区域。例如:

text
prod/payment/pii/phone/aes-gcm
prod/account/identity/id-card/aes-gcm
prod/log/security/event/aes-gcm

密钥隔离粒度应根据风险确定。高敏感数据应单独使用 KEK 或 named key;跨租户系统应避免多个租户共享同一 DEK;涉及支付、身份、认证凭证的数据应独立密钥空间、独立权限策略和独立审计规则。

10.4 AAD 设计

AES-GCM 的 AAD 可绑定上下文,防止密文被跨场景复制使用。AAD 可包含:

  1. tenantId
  2. appId
  3. tableName
  4. fieldName
  5. resourceId
  6. dataClass
  7. keyPurpose
  8. schemaVersion

AAD 不需要保密,但解密时必须一致。若攻击者将某字段密文复制到另一个字段,由于 AAD 不匹配,认证校验应失败。

10.5 轮转与重包装流程

密钥轮转流程应包含:

  1. 安全团队创建新 key version 或触发 KMS/Vault rotate。
  2. 新写入数据使用新版本密钥。
  3. 旧密文继续保留原 key version 元数据。
  4. 解密流程根据元数据自动选择对应版本。
  5. 对需要升级保护层级的数据执行 rewrap,只重包装 encrypted DEK,不重加密业务数据。
  6. 对疑似泄露场景执行强制 re-encrypt,重新生成 DEK 并重加密业务数据。
  7. 轮转后验证新旧数据可读性、审计日志完整性和异常率。
  8. 在确认无历史依赖前,不删除旧 key material。

10.6 观测与审计

加解密平台应采集以下指标:

  1. encrypt/decrypt/generateDataKey 调用量。
  2. KMS/Vault 请求延迟。
  3. KMS/Vault 错误码与限流次数。
  4. keyId/keyVersion 使用分布。
  5. 解密失败原因,包括 tag 校验失败、AAD 不匹配、权限拒绝、key disabled。
  6. 明文解密调用来源、调用时间、调用用户、调用服务。
  7. 高危密钥操作,包括 disable、delete、rotate、policy change。
  8. 异常访问模式,例如非业务时间大量 decrypt、跨区域异常调用、失败率突增。

审计日志不得记录明文数据、明文 DEK、token、root key、unseal key shares 或任何可恢复密钥材料。


11 风险与控制措施

11.1 密钥泄露风险

密钥泄露会导致密文保护失效。控制措施包括:高层级密钥不出 KMS/HSM/Vault,应用仅获得最小使用权限,明文 DEK 短时存在内存,密钥访问全量审计,疑似泄露后立即轮转 KEK 或重新加密数据。

11.2 密钥丢失风险

密钥丢失会导致密文不可恢复。AWS Encryption SDK 文档指出,如果 wrapping keys 丢失或删除,加密数据将不可恢复 [7]。因此,密钥删除必须设置审批、延迟删除、备份、恢复演练和依赖扫描。业务侧必须记录 keyId 和 keyVersion,否则历史密文可能无法定位对应密钥。

11.3 算法与参数错误风险

AES-GCM 的 nonce 复用会破坏安全性。工程系统应由 SDK 统一生成随机 nonce,不允许业务开发手动传入固定 nonce。算法标识、tag、AAD、keyVersion 必须与密文绑定保存。禁止使用自研密码算法、硬编码 IV、ECB 模式、固定盐值派生密钥、字符串保存明文密钥等实现。

11.4 远程服务依赖风险

KMS/Vault 故障会影响加密或解密链路。控制措施包括:高可用部署、跨区域灾备、客户端超时、熔断、限流、降级策略、数据密钥缓存策略和密钥服务 SLA 管理。数据密钥缓存可以降低 KMS 调用频率,但会延长明文密钥在应用侧的驻留时间,因此应限制缓存时间、缓存条数和缓存用途。


12 结论

数据加解密的企业级落地不是单一 AES 调用,而是由标准算法、密钥层级、密钥托管、权限控制、审计、轮转、恢复和应用 SDK 共同构成的体系。信封加密是该体系中的核心模式。其基本思想是使用 DEK 加密业务数据,使用 KEK、主密钥或 KMS key 包装 DEK,并由根密钥、KMS、HSM 或 Vault 保护更高层级密钥。该模式兼顾了大规模数据本地加密的性能、集中式密钥管理的可控性和密钥轮转的可操作性。

HashiCorp Vault Transit 提供了加密即服务和数据密钥生成能力,适合统一密码服务和私有化密钥平台。AWS KMS、Google Cloud KMS 与 Azure Key Vault 则代表云厂商托管 KMS 的标准实现路径。企业在落地时,应基于数据敏感等级、吞吐量、合规要求、租户隔离、审计要求和灾备要求选择远程加密、本地信封加密或二者结合的模式。对于高吞吐、大对象和跨语言系统,本地信封加密加集中式 KMS/Vault 管理是更通用的架构;对于小字段、强审计和统一平台化场景,Vault Transit 或远程 KMS 加密具有明确工程价值。

参考文献

[1] NIST SP 800-57 Part 1 Rev. 5, Recommendation for Key Management. [2] NIST FIPS 197, Advanced Encryption Standard. [3] NIST SP 800-38D, Recommendation for Block Cipher Modes of Operation: GCM and GMAC. [4] AWS KMS Cryptography Essentials. [5] AWS KMS GenerateDataKey API Reference. [6] Google Cloud KMS Envelope Encryption. [7] AWS Encryption SDK Concepts. [8] AWS KMS FAQ. [9] AWS KMS Key Rotation Documentation. [10] HashiCorp Vault Transit Secrets Engine. [11] HashiCorp Vault Security Model and Seal/Unseal Documentation. [12] Azure Key Vault and Azure Encryption at Rest Documentation.

GitHub Discussions

参与讨论

评论会同步到 stellhub/stell-web 仓库的 GitHub Discussions。

Powered by VitePress and GitHub Discussions.