2. TDE 密钥体系结构:DEK、证书、SMK/AK 的关系与交互流程
很多人一开始看 TDE 的密钥结构,会觉得有点绕。其实说白了,它就三层:最顶层是实例级的主密钥,中间是证书,最底层是每个数据库自己的加密密钥。这三层环环相扣,缺一个都打不开数据。
我刚开始接触 TDE 时,也搞混过 DEK 和证书的关系。有一次给客户做架构评审,对方 DBA 问我:“为什么不能直接用证书加密数据?” 这个问题问得很好。你想想看,如果直接拿证书去加密几十 GB 的数据文件,性能开销得多大?而且证书轮换时,整个数据库都得重加密,那简直是灾难。
2.1 三个核心角色的定义
我们先把这个体系里的三个角色认清楚。我习惯用一个比喻来记:SMK 是保险箱,证书是钥匙盒,DEK 是实际的钥匙。
| 角色 | 全称 | 存储位置 | 保护对象 | 生命周期 |
|---|---|---|---|---|
| SMK | Service Master Key | 实例级别,SQL Server 启动时加载 | 证书的私钥 | 实例创建时生成,极少变动 |
| AK | Asymmetric Key | 实例级别,可替代 SMK | 证书的私钥 | 手动管理,可轮换 |
| 证书 | Certificate | master 数据库 | DEK | 创建 TDE 时指定,可轮换 |
| DEK | Database Encryption Key | 用户数据库的文件头 | 数据库文件(MDF/NDF/LDF) | 开启 TDE 后一直存在 |
2.2 交互流程:数据写入时发生了什么?
当一个事务要写入数据页时,TDE 的加密链路是这样跑的 —— 嗯,这里要注意,这个流程发生在内存中,对应用程序完全透明。
- SQL Server 进程启动:SMK 自动加载到内存,它由 Windows DPAPI 保护。
- 证书私钥解密:SMK 解密 master 数据库中证书的私钥,证书在内存中变为可用状态。
- DEK 加载:证书用公钥解密用户数据库文件头中的 DEK 密文,DEK 明文进入内存。
- 数据页加密:当脏页写入磁盘前,内存中的 DEK 对称密钥对数据页进行 AES-256 加密。
- 写入磁盘:加密后的数据页写入 MDF/LDF 文件。
整个过程,应用程序不需要做任何改动。这也是 TDE 最吸引人的地方 —— 加密对上层完全透明。
2.3 交互流程图解
2.4 恢复流程:没有证书,数据就是一堆废铁
有一次,我一个朋友的公司做灾难恢复演练。他们把完整的数据库文件备份和日志备份都复制到了新服务器,结果恢复时直接报错。为什么?因为新实例上没有 TDE 的证书。我曾反复在内部培训时说:证书备份比数据库备份还重要。
恢复流程是这样的:
- 第一步:必须先在目标实例上创建证书。如果证书丢失,数据就真的没了。
- 第二步:证书的私钥会被新实例的 SMK 自动保护。
- 第三步:附加或还原数据库文件,DEK 会由新实例的证书解密。
- 第四步:TDE 自动恢复,数据库正常工作。
2.5 密钥轮换时的交互变化
你可能会问:“如果我想换证书,会发生什么?” 我建议你先想清楚一件事:轮换证书不影响数据文件。因为 DEK 本身没有变,只是保护 DEK 的证书变了。
处理流程是:
- 创建新证书,用 SMK 保护其私钥。
- 执行
ALTER DATABASE ENCRYPTION KEY,用新证书重新加密 DEK。 - 这是一个元数据操作,只需要读写数据库文件头,非常快。
- 旧证书可以安全删除(前提是你不再需要它做恢复)。
2.6 实战中的常见误区
| 常见误区 | 正确理解 | 我遇到的情况 |
|---|---|---|
| DEK 可以用密码直接保护 | DEK 必须由证书或 EKM 保护 | 有人想绕过证书,直接用 CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD,这是不支持的 |
| 证书备份一次就够了 | 每次轮换或重建证书后,必须重新备份 | 有一次客户轮换了证书,旧的备份还在,但新的证书没备份。结果新证书丢失,旧备份又匹配不上 DEK,只能回滚 |
| SMK 不需要管理 | SMK 最好单独备份,并考虑启用 DPAPI 保护 | 实例重建后 SMK 会变化,如果你没有备份 SMK,就需要手动关联所有证书 |
讲到底,TDE 的密钥体系说复杂也复杂,说简单也简单。记住那个三层分级模型就好:SMK 保护证书,证书保护 DEK,DEK 保护数据。每一层只做一件事,各司其职。
我个人觉得,理解这套体系的关键不在于记住每个步骤,而在于建立“信任链”的概念。磁盘上的 DEK 是密文,没人能直接拿到;证书保护它;SMK 保护证书。你想要破解数据,就必须同时拿到这三样东西。而这三样东西分布在不同的存储位置 —— 数据文件、master 数据库、操作系统保护层。这就是 TDE 安全性的根本。