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。
实际流程可以拆解成这样:
- 调用GenerateDataKey API:你告诉KMS,给我一个新DEK。
- 生成明文DEK:KMS内部的安全模块生成一个随机的256位密钥。
- 生成密文DEK:KMS立刻用你指定的CMK,对这个明文DEK进行加密。
- 返回两个东西:明文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帮忙。
完整的解密流程是这样的:
- 拿到密文DEK和密文数据:从存储系统里读取。
- 调用Decrypt API:把密文DEK发给KMS,告诉它用CMK解密。
- KMS返回明文DEK:CMK解密密文DEK,返回明文DEK给客户端。
- 用明文DEK解密数据:对密文数据进行AES解密,得到原始数据。
- 清除明文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从生成到销毁的关键节点串联起来了。你会发现,日志审计点遍布各个环节。你在做日志关联查询时,可以从图中的任何一个节点切入,向上游或下游追溯。比如,发现了一条异常的Decrypt日志,你可以顺着箭头往左查,看看对应的GenerateDataKey是否合规。这就是我常说的“日志关联的波纹效应”——找到一点,波动全局。