4. DEK(数据加密密钥)简介:生成、加密、解密过程及其日志

咱们今天聊聊DEK。说白了,就是数据加密密钥。

我个人习惯把DEK叫做“干活儿的钥匙”。CMK是管这把钥匙的,DEK才是真正去加密你那一堆业务数据的核心。很多刚接触KMS的朋友容易搞混,觉得有了CMK就万事大吉。其实不是这样。

你想想,如果每次加密几百GB的数据都用CMK硬算,那性能开销谁也扛不住。所以就有了DEK这张“王牌”。

4.1 DEK是怎么生成的?

DEK的生成过程,我用一句话概括:由CMK来“生”,但不依赖于CMK来“长”。

什么意思?生成DEK时,KMS首先会用安全的随机数生成器,创造一个256位的AES对称密钥。这个步骤,CMK是不参与的。CMK的作用是在DEK生下来之后,给它“穿一件防护衣”。

我记得在一次金融客户的项目里,对方的安全主管问我:“DEK生成了,是不是就明文留在内存里了?”这是个好问题。答案是:会,但非常短暂。

核心要点: DEK的生成过程分两步走——先产生明文DEK,再由CMK立即加密成密文DEK。

实际流程可以拆解成这样:

  1. 调用GenerateDataKey API:你告诉KMS,给我一个新DEK。
  2. 生成明文DEK:KMS内部的安全模块生成一个随机的256位密钥。
  3. 生成密文DEK:KMS立刻用你指定的CMK,对这个明文DEK进行加密。
  4. 返回两个东西:明文DEK(给你本地用)和密文DEK(给你存起来)。

这里有个坑,我经常跟团队强调:明文DEK用完之后一定要及时“销毁”。别把它写到日志里,别存到磁盘上。我在审计中见过不少因为明文DEK泄露导致的惨案。

4.2 DEK是怎么加密数据的?

这步其实很简单。你拿到了明文DEK,就可以用它来加密你的业务数据了。用的是对称加密算法,比如AES-256-GCM。

为什么用对称加密?说白了就是快。非对称加密加解密几百兆数据,CPU能烧到冒烟。对称加密的速度快了好几个数量级。

加密过程可以归纳为这几步:

  • 获取明文DEK:从KMS拿到临时明文密钥。
  • 加密数据:用明文DEK对数据进行AES加密,生成密文数据。
  • 清理明文DEK:加密完成后,立即从内存中清除明文DEK。
  • 存储密文数据 + 密文DEK:只保存加密后的数据和加密后的DEK。

我见过一个运维同事,加密完数据后忘了清内存。结果一个core dump把明文DEK全打印出来了。嗯,那次事故挺严重的。

个人建议: 加密完成后,手动将明文DEK变量置空,并调用系统的安全内存清理函数。别留着“过年”。

4.3 DEK是怎么解密数据的?

解密就是加密的逆过程,但有一个关键环节——你手里只有密文DEK。

想想看,你存数据的时候只存了密文DEK。现在要解密,你需要明文DEK。谁有?CMK有。所以你得先找CMK帮忙。

完整的解密流程是这样的:

  1. 拿到密文DEK和密文数据:从存储系统里读取。
  2. 调用Decrypt API:把密文DEK发给KMS,告诉它用CMK解密。
  3. KMS返回明文DEK:CMK解密密文DEK,返回明文DEK给客户端。
  4. 用明文DEK解密数据:对密文数据进行AES解密,得到原始数据。
  5. 清除明文DEK:解密完成后,立刻从内存中清理。

这里有个安全设计我想特别提一下:CMK本身从不离开KMS。我原来有一任领导,死活想不通这个原理,觉得CMK被调用了就应该能看到。他错了。CMK始终在KMS的黑盒里,你拿到的只是CMK加解密后的结果。这叫做“信封加密”。

4.4 日志归纳总结:关键审计点

我是做日志审计出身的。DEK相关的日志,有几个地方是必查的。你在创建审计规则的时候,可以盯着这几个维度。

日志类型 关键字段 需关注点
GenerateDataKey KeyId, KeySpec, EncryptionContext 谁调用的?什么时间?上下文是否合规?
Decrypt KeyId, CiphertextBlob 的前缀 解密频率是否异常?是否有未授权的调用?
ReEncrypt SourceKeyId, DestinationKeyId 密钥轮换是否正常?是否有非预期的目标CMK?
明文DEK泄露事件 应用程序日志中的“DEK”或“Key”字眼 是否有明文DEK被意外输出?

我曾经在一次内部渗透测试中,发现某应用的Debug日志会打印完整的明文DEK。原因就是开发者为了方便调试,直接把变量值写到了日志里。这是个致命错误。你想想看,如果日志服务器被攻破,攻击者拿到明文DEK,那所有加密数据就跟没穿衣服一样。

避坑指南: 所有涉及DEK的日志,应当只记录“操作类型”、“使用的密钥ID”和“操作结果”。严禁记录明文DEK、密文DEK的具体值。如果你非要记录,建议只记录密文DEK的前8位作为指纹。

最后,我建议你在做日志关联查询时,建立一个DEK生命周期的基线。比如,哪个用户经常调用Decrypt?哪个时间段GenerateDataKey频次突然变高?这些异常行为,往往会指向安全事件。

DEK 生命周期与日志节点 生成明文DEK CMK加密DEK 加密/解密数据 清理明文DEK 记录审计日志 存储密文DEK 审计日志节点摘要: • GenerateDataKey → 记录生成请求、使用的CMK、EncryptionContext • Encrypt/Decrypt → 记录操作的目标密钥ID、调用者身份、时间戳 • 清理操作 → 记录清理时间点,确保DEK不会残留 • 注意:所有日志不得记录明文DEK!

这张图把DEK从生成到销毁的关键节点串联起来了。你会发现,日志审计点遍布各个环节。你在做日志关联查询时,可以从图中的任何一个节点切入,向上游或下游追溯。比如,发现了一条异常的Decrypt日志,你可以顺着箭头往左查,看看对应的GenerateDataKey是否合规。这就是我常说的“日志关联的波纹效应”——找到一点,波动全局。