透明数据加密 (TDE)

透明数据加密 (TDE)加密 SQL Server 和 Azure SQL 数据库数据文件,称为静态加密数据。 可以采取多种预防措施来帮助保护数据库,例如设计安全系统、加密机密资产以及围绕数据库服务器构建防火墙。 但是,在物理介质(如驱动器或备份磁带)被盗的情况下,恶意方只需还原或附加数据库并浏览数据。 一种解决方案是加密数据库中的敏感数据,并保护用于使用证书加密数据的密钥。 这可以防止没有密钥的任何人使用数据,但必须提前计划这种保护。

TDE 针对数据和日志文件执行实时 I/O 加密和解密。 加密使用数据库加密密钥 (DEK),它存储在数据库引导记录中,可在恢复时使用。 DEK 是使用存储在服务器的 master 数据库中的证书保护的对称密钥,或者是由 EKM 模块保护的非对称密钥。 TDE 保护“处于休眠状态”的数据,即数据和日志文件。 它提供了遵从许多法律、法规和各个行业建立的准则的能力。 这使软件开发人员能够使用 AES 和 3DES 加密算法加密数据,而无需更改现有应用程序。

重要

TDE 不提供跨通信通道的加密。 有关如何跨通信通道加密数据的详细信息,请参阅 “启用与数据库引擎(SQL Server Configuration Manager)的加密连接”。

相关主题:

关于 TDE

数据库文件加密在页面级执行。 加密数据库中的页面在写入磁盘之前进行加密,并在读取到内存时解密。 TDE 不会增加加密数据库的大小。

适用于 SQL 数据库的信息

将 TDE 与 SQL 数据库 V12 V12 (某些区域中的预览版)配合使用时,SQL 数据库会自动为你创建存储在 master 数据库中的服务器级证书。 若要在 SQL 数据库上移动 TDE 数据库,必须解密数据库,移动数据库,然后在目标 SQL 数据库上重新启用 TDE。 有关 SQL 数据库上的 TDE 的分步说明,请参阅 Azure SQL 数据库的透明数据加密

即使在已宣布 SQL 数据库 V12 版本系列正式发布的部分地区,TDE 的状态预览仍然适用。 在 Microsoft 宣布将 TDE for SQL 数据库从预览版提升到正式版之前,不应在生产数据库中使用 TDE。 有关 SQL 数据库 V12 的详细信息,请参阅 Azure SQL 数据库中的新增功能

适用于 SQL Server 的信息

保护数据库后,可以使用正确的证书还原数据库。 有关证书的详细信息,请参阅 SQL Server Certificates and Asymmetric Keys

启用 TDE 时,应立即备份证书以及与证书关联的私钥。 如果证书变得不可用,或者必须还原或附加另一台服务器上的数据库,则必须同时备份证书和私钥,或者无法打开数据库。 即使不再在数据库上启用 TDE,也应保留加密证书。 即使数据库未加密,事务日志的某些部分仍可能保持受保护状态,并且某些作可能需要证书,直到执行数据库的完整备份。 超过到期日期的证书仍可用于使用 TDE 加密和解密数据。

加密层次结构

下图显示了 TDE 加密的体系结构。 在 SQL 数据库上使用 TDE 时,只有数据库级项(数据库加密密钥和 ALTER DATABASE 部分是用户可配置的。

显示主题中所述的层次结构。

使用透明数据加密

若要使用 TDE,请执行以下步骤。

适用于:SQL Server。
  • 创建主密钥

  • 创建或获取由主密钥保护的证书

  • 创建数据库加密密钥并通过此证书保护该密钥

  • 将数据库设置为使用加密

下面的示例演示如何使用安装在名为 AdventureWorks2012 的服务器上的证书加密和解密 MyServerCert数据库。

USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>';
go
CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate';
go
USE AdventureWorks2012;
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE MyServerCert;
GO
ALTER DATABASE AdventureWorks2012
SET ENCRYPTION ON;
GO

加密和解密操作由 SQL Server 安排在后台线程中执行。 可以使用本主题后面显示的列表中的目录视图和动态管理视图查看这些作的状态。

谨慎

启用了 TDE 的数据库的备份文件也使用数据库加密密钥进行加密。 因此,当您还原这些备份时,用于保护数据库加密密钥的证书必须可用。 这意味着除了备份数据库外,还需确保维护服务器证书的备份以防止数据丢失。 如果证书不再可用,将会导致数据丢失。 有关详细信息,请参阅 SQL Server Certificates and Asymmetric Keys

命令和函数

TDE 证书必须由数据库主密钥加密,这样才能被以下语句接受。 如果它们仅通过密码加密,这些语句将拒绝它们作为加密对象。

重要

在 TDE 使用证书后将证书更改为受密码保护,将导致数据库在重启后变得不可访问。

下表提供了 TDE 命令和函数的链接和说明。

命令或函数 目的
CREATE DATABASE ENCRYPTION KEY (Transact-SQL) 创建用于加密数据库的密钥。
ALTER DATABASE ENCRYPTION KEY (Transact-SQL) 更改用于加密数据库的密钥。
DROP DATABASE ENCRYPTION KEY (“Transact-SQL”) 删除用于加密数据库的密钥。
ALTER DATABASE SET 选项 (Transact-SQL) 说明 ALTER DATABASE 用于启用 TDE 的选项。

目录视图和动态管理视图

下表显示了 TDE 目录视图和动态管理视图。

目录视图或动态管理视图 目的
sys.databases (Transact-SQL) 显示数据库信息的目录视图。
sys.certificates (Transact-SQL) 显示数据库中证书的目录视图。
sys.dm_database_encryption_keys(Transact-SQL) 动态管理视图,提供有关数据库中使用的加密密钥以及数据库加密状态的信息。

权限

每个 TDE 功能和命令都有单独的权限要求,如前面所示的表中所述。

查看与 TDE 相关的元数据需要对证书具有 VIEW DEFINITION 权限。

注意事项

在对数据库进行重新加密扫描时,数据库的维护操作被禁用。 可以使用数据库的单个用户模式设置来执行维护作。 有关详细信息,请参阅 将数据库设置为单用户模式

可以使用sys.dm_database_encryption_keys动态管理视图找到数据库加密的状态。 有关详细信息,请参阅本主题前面的“目录视图和动态管理视图”部分。

在 TDE 中,数据库中的所有文件和文件组都经过加密。 如果数据库中的任何文件组都标记为只读,则数据库加密作将失败。

如果在数据库镜像或日志传送中使用数据库,则会加密这两个数据库。 日志事务在发送到双方之间时将被加密。

重要

设置数据库进行加密时,将加密任何新的全文索引。 以前创建的全文索引将在升级期间导入,在将数据加载到 SQL Server 后,它们将位于 TDE 中。 对列启用全文索引可能会导致该列的数据在全文索引扫描期间以纯文本形式写入磁盘。 建议不要对敏感加密数据创建全文索引。

加密的数据压缩明显小于等效的未加密数据。 如果 TDE 用于加密数据库,则备份压缩将无法显著压缩备份存储。 因此,不建议同时使用 TDE 和备份压缩。

限制

在初始数据库加密、密钥更改或数据库解密期间不允许执行以下作:

  • 从数据库中的文件组中删除文件

  • 删除数据库

  • 使数据库脱机

  • 分离数据库

  • 将数据库或文件组转换为只读状态

在执行 CREATE DATABASE ENCRYPTION KEY、ALTER DATABASE ENCRYPTION KEY、DROP DATABASE ENCRYPTION KEY 或 ALTER DATABASE...SET ENCRYPTION 语句时,以下操作是不允许的。

  • 从数据库中的文件组中删除文件。

  • 删除数据库。

  • 使数据库脱机。

  • 分离数据库。

  • 将数据库或文件组转换为只读状态。

  • 使用 ALTER DATABASE 命令。

  • 启动数据库或数据库文件备份。

  • 启动数据库或数据库文件还原。

  • 创建快照。

以下操作或条件将阻止 CREATE DATABASE ENCRYPTION KEY、ALTER DATABASE ENCRYPTION KEY、DROP DATABASE ENCRYPTION KEY 或 ALTER DATABASE...SET ENCRYPTION 语句。

  • 数据库是只读的,或者具有任何只读文件组。

  • 正在执行 ALTER DATABASE 命令。

  • 任何数据备份都正在运行。

  • 数据库处于脱机状态或还原状态。

  • 快照正在进行中。

  • 数据库维护任务。

创建数据库文件时,启用 TDE 时,即时文件初始化不可用。

若要使用非对称密钥加密数据库加密密钥,非对称密钥必须驻留在可扩展的密钥管理提供程序上。

透明数据加密和事务日志

使数据库能够使用 TDE 会导致虚拟事务日志的剩余部分被“清零”,从而强制生成下一个虚拟事务日志。 这可以保证在为加密设置数据库后事务日志中没有明文。 可以通过查看 encryption_state 视图中的列 sys.dm_database_encryption_keys 来查找日志文件加密的状态,如以下示例所示:

USE AdventureWorks2012;
GO
/* The value 3 represents an encrypted state 
   on the database and transaction logs. */
SELECT *
FROM sys.dm_database_encryption_keys
WHERE encryption_state = 3;
GO

有关 SQL Server 日志文件体系结构的详细信息,请参阅事务日志(SQL Server)。

在数据库加密密钥更改之前写入事务日志的所有数据都将使用以前的数据库加密密钥进行加密。

两次修改数据库加密密钥后,必须先执行日志备份,然后才能再次修改数据库加密密钥。

透明数据加密和 tempdb 系统数据库

如果使用 TDE 对 SQL Server 实例上的任何其他数据库进行加密,则 tempdb 系统数据库将加密。 这可能会对同一 SQL Server 实例上的未加密数据库产生性能影响。 有关 tempdb 系统数据库的详细信息,请参阅 tempdb 数据库

透明数据加密和复制

复制不会以加密形式自动从启用了 TDE 的数据库复制数据。 如果要保护分发数据库和订阅服务器数据库,则必须单独启用 TDE。 快照复制,以及用于事务复制和合并复制的数据的初始分布,可以将数据存储在未加密的中间文件中;例如,bcp 文件。 在事务复制或合并复制期间,可以启用加密来保护信道。 有关详细信息,请参阅启用数据库引擎的加密连接(SQL Server 配置管理器)

透明数据加密和 FILESTREAM 数据

即使启用了 TDE,FILESTREAM 数据也不会加密。

透明数据加密和缓冲池扩展

使用 TDE 加密数据库时,不会加密与缓冲池扩展(BPE)相关的文件。 对于 BPE 相关文件,必须使用文件系统级加密工具(如 Bitlocker 或 EFS)。

透明数据加密和 In-Memory OLTP

可以在具有 In-Memory OLTP 对象的数据库上启用 TDE。 如果启用了 TDE,则 In-Memory OLTP 日志记录进行加密。 如果启用了 TDE,则不会加密MEMORY_OPTIMIZED_DATA文件组中的数据。

另请参阅

将受 TDE 保护的数据库移动到另一个 SQL Server,使用 EKM透明数据加密和 Azure SQL 数据库加密 SQL Server 加密 SQLServer 和数据库加密密钥(数据库引擎)安全中心(适用于 SQL Server 数据库引擎和 Azure SQL 数据库FILESTREAM)的 TDE