透明数据加密 (TDE)

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

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

关于 TDE

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

适用于 SQL 数据库的信息

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

即使在SQL 数据库的版本系列 V12 宣布为正式发布状态的地理区域子集,TDE 的状态预览也适用。 在 Microsoft 宣布 TDE 从预览版升级到正式版之前,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) 介绍用来启用 TDE 的 ALTER DATABASE 选项。

目录视图和动态管理视图

下表显示了 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 过程中,数据库中的所有文件和文件组都进行加密。 如果将数据库中的任何文件组标记为 READ ONLY,数据库加密操作将会失败。

如果某个数据库正在用于数据库镜像或日志传送,则两个数据库都将进行加密。 日志事务将以加密形式在它们之间发送。

重要

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

与未加密数据相比,同样的加密数据的压缩率要小得多。 如果使用 TDE 对数据库进行加密,备份压缩将无法显著压缩备份存储。 因此,不建议将 TDE 与备份压缩一起使用。

限制

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

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

  • 删除数据库

  • 使数据库脱机

  • 分离数据库

  • 将数据库或文件组转换为 READ ONLY 状态

在执行 CREATE DATABASE ENCRYPTION KEY、ALTER DATABASE ENCRYPTION KEY、DROP DATABASE ENCRYPTION KEY 或 ALTER DATABASE...SET ENCRYPTION 语句期间,不允许执行下列操作。

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

  • 删除数据库。

  • 使数据库脱机。

  • 分离数据库。

  • 将数据库或文件组转换为 READ ONLY 状态。

  • 使用 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。

透明数据加密和内存中 OLTP

可在拥有内存中 OLTP 对象的数据库上启用 TDE。 如果启用 TDE,则内存中 OLTP 日志记录会被加密。 如果启用了 TDE,则不对 MEMORY_OPTIMIZED_DATA 文件组中的数据进行加密。

另请参阅

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