CSDN0BLOG 2020-06-07
对于数据的加密,可以使用证书、对称密钥和非对称密钥,这三种加密机制用于保护数据,SQL Server还提供一种加密功能,透明数据加密(Transparent Data Encryption,TDE),用于对数据库的文件(数据文件和日志文件)进行加密。除了在操作系统层面对文件进行访问控制(权限控制)之外,还要确保服务器被攻击之后文件被窃取的情况。为了避免文件被窃取后通过特权方式获得数据,有必要对文件也进行数据安全加密,即使文件被窃取,如果不能对文件进行解密,那么数据也是安全的。
TDE对数据和日志文件进行实时IO加密和解密。加密过程使用的是数据库加密密钥(Database Encryption Key,DEK),DEK是对称密钥,存储在数据库的启动记录(boot record)中。DEK由证书来保护,该证书存在服务器的主数据库中;DEK也可以由EKM模块保护的非对称密钥来保护。也就是说,如果数据库文件(mdf、ndf、ldf或bak)被窃取,由于没有完整的解密密钥,数据库不可使用。不过如果连master库或者这个服务器证书也一并被窃取,那么还是可以解密的。
TDE在Page级别对数据库文件进行加密,Page在被写入硬盘之前被加密,并在读入内存之前被解密。也就是说,当启用数据库的TDE功能之后,数据和日志会在写入磁盘前被加密,然后在加载到内存时被解密。这个过程对于用户、应用程序都是透明的。
除了透明之外,TDE不会增加加密数据库的大小,加解密之前数据库的大小是相同的。并且对数据库的性能影响较小,TDE对加解密的开销都有很大的调整,相对于很多加密技术而言,性能影响更加小。
TDE使用master数据库中的证书来保护DEK,使用DEK来加密和解密数据。
启用数据库的TDE:
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
数据库加密密钥(Database Encryption Key,DEK)是对称密钥,由证书(存储在master数据库中)或非对称密钥(存储在EKM中)来保护。在启用TDE之前,必须创建DEK。DEK不能导出,只在当前的系统有效。
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = { AES_128 | AES_192 | AES_256 | TRIPLE_DES_3KEY } ENCRYPTION BY SERVER { CERTIFICATE Encryptor_Name | ASYMMETRIC KEY Encryptor_Name }
参数注释: WITH ALGORITHM = { AES_128 | AES_192 | AES_256 | TRIPLE_DES_3KEY }:指定DEK用于加密数据的算法,从SQL Server 2017开始,除了TRIPLE_DES_3KEY之外,AES_128 | AES_192 | AES_256 都已经过时。
用户可以从 sys.dm_database_encryption_keys 的 字段 encryption_state 查看数据库加密的状态:
0 = No database encryption key present, no encryption
1 = Unencrypted
2 = Encryption in progress
3 = Encrypted
4 = Key change in progress
5 = Decryption in progress
6 = Protection change in progress (The certificate or asymmetric key that is encrypting the database encryption key is being changed.)
为了启用数据库的TDE,SQL Server必须做一个加密扫描,把数据文件中的每个页面读入缓冲池,然后把加密后的页面写回磁盘。为了让您更好地控制加密扫描,SQL Server 2019(15.x)引入了TDE扫描,该扫描具有暂停和恢复语法。 您可以在系统的工作负载很重时或在关键业务时间内暂停扫描,然后稍后再恢复扫描。
使用以下语法开始扫描:
ALTER DATABASE <db_name> SET ENCRYPTION ON;
使用以下语法暂停扫描;
ALTER DATABASE <db_name> SET ENCRYPTION SUSPEND;
使用以下语法继续扫描:
ALTER DATABASE <db_name> SET ENCRYPTION RESUME;
参考文档: