Skip to content

SQLServer 数据加密

数据加密概述

数据加密是指使用加密算法将明文数据转换为密文数据,保护数据在存储过程中的安全性。SQL Server 提供了多种数据加密功能,包括透明数据加密 (TDE)、列级加密和备份加密等,可以根据业务需求选择合适的加密方式。

数据加密的类型

SQL Server 支持以下类型的数据加密:

  1. 透明数据加密 (TDE)

    • 加密整个数据库的数据文件和日志文件
    • 对应用程序透明,不需要修改应用程序代码
    • 保护数据在存储和备份过程中的安全性
    • 适用于需要保护整个数据库的场景
  2. 列级加密

    • 加密表中的特定列
    • 需要修改应用程序代码以使用加密列
    • 提供更细粒度的加密控制
    • 适用于需要保护敏感列的场景
  3. 备份加密

    • 加密数据库备份文件
    • 保护备份数据的安全性
    • 支持多种加密算法
    • 适用于需要保护备份数据的场景
  4. Always Encrypted

    • 客户端加密,数据在客户端加密后传输到服务器
    • 服务器无法查看明文数据
    • 适用于需要保护敏感数据的场景,如信用卡号、身份证号等

加密算法

SQL Server 支持以下加密算法:

  1. 对称加密算法

    • AES-128、AES-192、AES-256(推荐使用)
    • 3DES
    • DES(已被认为不安全,不推荐使用)
  2. 非对称加密算法

    • RSA_512、RSA_1024、RSA_2048
    • ECC(椭圆曲线加密)
  3. 哈希算法

    • SHA-1(已被认为不安全,不推荐使用)
    • SHA-2_256、SHA-2_512
    • MD5(已被认为不安全,不推荐使用)

透明数据加密 (TDE)

TDE 概述

透明数据加密 (Transparent Data Encryption, TDE) 是 SQL Server 提供的一种数据库级别的加密功能,它加密整个数据库的数据文件和日志文件,对应用程序透明,不需要修改应用程序代码。

TDE 工作原理

  1. 加密层次结构

    • 服务主密钥 (Service Master Key, SMK):存储在 Windows 本地密钥库中,保护数据库主密钥
    • 数据库主密钥 (Database Master Key, DMK):存储在数据库中,保护证书和非对称密钥
    • 证书:存储在数据库中,保护数据库加密密钥
    • 数据库加密密钥 (Database Encryption Key, DEK):用于加密和解密数据库文件
  2. 加密过程

    • 当数据库启用 TDE 后,SQL Server 使用 DEK 加密数据库的数据文件和日志文件
    • DEK 本身使用证书加密,证书使用 DMK 加密,DMK 使用 SMK 加密
    • 数据在写入磁盘时加密,在读取时解密
    • 加密和解密过程对应用程序透明

TDE 配置步骤

  1. 创建数据库主密钥

    sql
    -- 切换到 master 数据库
    USE master;
    GO
    
    -- 创建服务主密钥(如果不存在)
    IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = '##MS_ServiceMasterKey##')
    BEGIN
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPassword123!';
    END;
    GO
    
    -- 创建证书
    CREATE CERTIFICATE TDECertificate WITH SUBJECT = 'TDE Certificate';
    GO
  2. 启用 TDE

    sql
    -- 切换到目标数据库
    USE [TargetDatabase];
    GO
    
    -- 创建数据库加密密钥
    CREATE DATABASE ENCRYPTION KEY
    WITH ALGORITHM = AES_256
    ENCRYPTION BY SERVER CERTIFICATE TDECertificate;
    GO
    
    -- 启用透明数据加密
    ALTER DATABASE [TargetDatabase] SET ENCRYPTION ON;
    GO
  3. 监控 TDE 状态

    sql
    -- 查看 TDE 状态
    SELECT 
        db.name,
        db.is_encrypted,
        dm.encryption_state,
        dm.encryption_state_desc,
        dm.percent_complete,
        dm.key_algorithm,
        dm.key_length
    FROM sys.databases db
    LEFT JOIN sys.dm_database_encryption_keys dm ON db.database_id = dm.database_id;

TDE 最佳实践

  1. 备份证书和私钥

    sql
    -- 备份证书和私钥
    BACKUP CERTIFICATE TDECertificate 
    TO FILE = 'C:\TDECertificate.cer' 
    WITH PRIVATE KEY (FILE = 'C:\TDECertificate.pvk', ENCRYPTION BY PASSWORD = 'StrongPassword456!');
  2. 定期轮换证书

    • 定期更换 TDE 证书,提高安全性
    • 轮换证书时,不需要重新加密整个数据库
    • 可以保留旧证书,用于恢复旧备份
  3. 监控 TDE 性能

    • TDE 会带来一定的性能开销,主要是 CPU 开销
    • 监控数据库的性能,特别是 CPU 使用率
    • 对于性能敏感的应用,需要评估 TDE 的影响
  4. 注意事项

    • TDE 不加密内存中的数据
    • TDE 不加密 TempDB 中的用户数据,但如果任何数据库启用了 TDE,TempDB 也会被加密
    • TDE 加密的数据库备份文件也会被加密

列级加密

列级加密概述

列级加密是指加密表中的特定列,提供更细粒度的加密控制。列级加密需要修改应用程序代码以使用加密列,但提供了更高的安全性。

列级加密的类型

SQL Server 支持以下类型的列级加密:

  1. 确定性加密

    • 相同的明文总是生成相同的密文
    • 支持索引和比较操作
    • 安全性较低,因为攻击者可以通过分析密文频率推断明文
  2. 随机加密

    • 相同的明文生成不同的密文
    • 不支持索引和比较操作
    • 安全性较高
  3. 证书加密

    • 使用证书加密列
    • 支持确定性和随机加密
  4. 非对称密钥加密

    • 使用非对称密钥加密列
    • 安全性较高,但性能较低

列级加密配置步骤

  1. 创建加密密钥

    sql
    -- 切换到目标数据库
    USE [TargetDatabase];
    GO
    
    -- 创建数据库主密钥(如果不存在)
    IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##')
    BEGIN
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPassword123!';
    END;
    GO
    
    -- 创建证书
    CREATE CERTIFICATE ColumnEncryptionCertificate WITH SUBJECT = 'Column Encryption Certificate';
    GO
    
    -- 创建对称密钥
    CREATE SYMMETRIC KEY ColumnEncryptionKey 
    WITH ALGORITHM = AES_256 
    ENCRYPTION BY CERTIFICATE ColumnEncryptionCertificate;
    GO
  2. 创建加密列

    sql
    -- 创建包含加密列的表
    CREATE TABLE [dbo].[EncryptedTable]
    (
        [Id] INT PRIMARY KEY IDENTITY(1,1),
        [Name] NVARCHAR(50),
        [SensitiveData] VARBINARY(MAX) -- 加密列
    );
    GO
  3. 使用加密列

    sql
    -- 打开对称密钥
    OPEN SYMMETRIC KEY ColumnEncryptionKey DECRYPTION BY CERTIFICATE ColumnEncryptionCertificate;
    GO
    
    -- 插入加密数据
    INSERT INTO [dbo].[EncryptedTable] ([Name], [SensitiveData])
    VALUES ('Test', EncryptByKey(Key_GUID('ColumnEncryptionKey'), 'Sensitive Information'));
    GO
    
    -- 查询加密数据
    SELECT 
        [Id],
        [Name],
        CONVERT(NVARCHAR(MAX), DecryptByKey([SensitiveData])) AS [SensitiveData]
    FROM [dbo].[EncryptedTable];
    GO
    
    -- 关闭对称密钥
    CLOSE SYMMETRIC KEY ColumnEncryptionKey;
    GO

列级加密最佳实践

  1. 只加密敏感列

    • 只加密真正需要保护的敏感列,如信用卡号、身份证号等
    • 避免加密所有列,减少性能开销
  2. 使用合适的加密算法

    • 优先使用 AES-256 等强加密算法
    • 根据业务需求选择确定性加密或随机加密
  3. 安全管理密钥

    • 定期轮换密钥
    • 备份密钥和证书
    • 限制密钥的访问权限
  4. 优化查询性能

    • 对于需要频繁查询的加密列,考虑使用确定性加密
    • 避免在 WHERE 子句中使用解密函数,影响查询性能

备份加密

备份加密概述

备份加密是指加密数据库备份文件,保护备份数据的安全性。备份加密支持多种加密算法,可以在备份时指定加密选项。

备份加密配置步骤

  1. 创建备份证书

    sql
    -- 切换到 master 数据库
    USE master;
    GO
    
    -- 创建备份证书
    CREATE CERTIFICATE BackupEncryptionCertificate WITH SUBJECT = 'Backup Encryption Certificate';
    GO
  2. 执行加密备份

    sql
    -- 执行加密备份
    BACKUP DATABASE [TargetDatabase]
    TO DISK = 'C:\TargetDatabase.bak'
    WITH 
        COMPRESSION,
        ENCRYPTION 
        (  
            ALGORITHM = AES_256,  
            SERVER CERTIFICATE = BackupEncryptionCertificate  
        ),
        STATS = 10;
    GO
  3. 从加密备份恢复

    sql
    -- 从加密备份恢复
    RESTORE DATABASE [TargetDatabase_Restored]
    FROM DISK = 'C:\TargetDatabase.bak'
    WITH 
        MOVE 'TargetDatabase' TO 'C:\Data\TargetDatabase_Restored.mdf',
        MOVE 'TargetDatabase_Log' TO 'C:\Log\TargetDatabase_Restored.ldf',
        STATS = 10;
    GO

备份加密最佳实践

  1. 使用强加密算法

    • 优先使用 AES-256 等强加密算法
    • 避免使用弱加密算法
  2. 备份证书和私钥

    • 备份用于加密备份的证书和私钥
    • 确保备份的安全性,存储在安全的位置
  3. 定期轮换证书

    • 定期更换备份加密证书,提高安全性
    • 保留旧证书,用于恢复旧备份
  4. 结合其他安全措施

    • 备份加密结合访问控制,限制备份文件的访问权限
    • 定期测试备份的可恢复性

Always Encrypted

Always Encrypted 概述

Always Encrypted 是 SQL Server 2016+ 提供的一种客户端加密功能,数据在客户端加密后传输到服务器,服务器无法查看明文数据。Always Encrypted 保护数据在传输和存储过程中的安全性,适用于需要保护敏感数据的场景。

Always Encrypted 工作原理

  1. 加密层次结构

    • 列主密钥 (Column Master Key, CMK):存储在客户端,如 Windows 证书存储、Azure Key Vault 等
    • 列加密密钥 (Column Encryption Key, CEK):用于加密和解密数据列
    • CEK 本身使用 CMK 加密后存储在服务器上
  2. 加密过程

    • 应用程序使用 ADO.NET 驱动或 ODBC 驱动在客户端加密数据
    • 加密后的数据传输到服务器,服务器存储加密数据
    • 查询数据时,服务器返回加密数据,客户端解密后使用

Always Encrypted 配置步骤

  1. 创建列主密钥和列加密密钥

    • 使用 SSMS 或 PowerShell 创建列主密钥和列加密密钥
    • 列主密钥可以存储在 Windows 证书存储、Azure Key Vault 或硬件安全模块 (HSM) 中
  2. 配置加密列

    • 使用 SSMS 或 T-SQL 配置表中的加密列
    • 指定加密类型(确定性加密或随机加密)和加密算法
  3. 修改应用程序

    • 更新连接字符串,添加 Column Encryption Setting=Enabled
    • 确保应用程序使用支持 Always Encrypted 的驱动

Always Encrypted 最佳实践

  1. 保护列主密钥

    • 将列主密钥存储在安全的位置,如 Azure Key Vault 或硬件安全模块
    • 限制列主密钥的访问权限
  2. 选择合适的加密类型

    • 对于需要索引和比较操作的列,使用确定性加密
    • 对于不需要索引和比较操作的列,使用随机加密
  3. 考虑性能影响

    • Always Encrypted 会带来一定的性能开销,特别是对于大量数据的查询
    • 测试应用程序在使用 Always Encrypted 后的性能
  4. 注意事项

    • Always Encrypted 不支持所有 T-SQL 功能,如在 WHERE 子句中使用加密列
    • 确保应用程序驱动支持 Always Encrypted

版本差异

SQL Server 2012

  • 支持透明数据加密 (TDE)
  • 支持列级加密
  • 支持备份加密

SQL Server 2014

  • 改进了 TDE 的性能
  • 增强了列级加密的功能
  • 支持更多加密算法

SQL Server 2016

  • 引入了 Always Encrypted
  • 增强了 TDE 的功能
  • 改进了列级加密的性能

SQL Server 2017+

  • 支持 Linux 环境下的数据加密
  • 增强了 Always Encrypted 的功能,如支持内存优化表
  • 支持 Azure Key Vault 集成

SQL Server 2022

  • 进一步增强了数据加密的安全性
  • 引入了新的加密算法
  • 改进了 Always Encrypted 的性能

常见问题 (FAQ)

Q: 数据加密会影响性能吗?

A: 数据加密会带来一定的性能开销,主要包括:

  1. 加密和解密数据的 CPU 开销
  2. 内存使用的增加
  3. 磁盘 I/O 的增加(加密数据通常比明文数据稍大)

性能开销的大小取决于多种因素,如加密类型、加密算法、数据量、CPU 性能等。在大多数情况下,性能开销是可以接受的,特别是对于需要高安全性的应用。

Q: 如何备份和恢复加密的数据库?

A: 备份和恢复加密的数据库需要:

  1. 确保已备份 TDE 证书和私钥
  2. 使用常规的备份和恢复命令
  3. 恢复数据库后,需要还原 TDE 证书(如果证书已丢失)

Q: 如何处理加密密钥丢失的问题?

A: 加密密钥丢失会导致无法访问加密数据,因此需要:

  1. 定期备份所有加密密钥和证书
  2. 将备份的密钥和证书存储在安全的位置
  3. 建立密钥管理策略,包括密钥轮换和恢复流程

Q: 数据加密和连接加密有什么区别?

A: 数据加密和连接加密的主要区别在于:

  1. 数据加密:保护数据在存储过程中的安全性,包括数据文件和备份文件
  2. 连接加密:保护数据在客户端和服务器之间传输过程中的安全性

两者都是 SQL Server 安全的重要组成部分,建议同时使用,提供端到端的数据保护。

Q: 如何选择合适的数据加密方式?

A: 选择数据加密方式需要考虑以下因素:

  1. 业务需求:需要保护的数据范围和敏感度
  2. 性能影响:不同加密方式的性能开销
  3. 应用程序修改:是否需要修改应用程序代码
  4. 管理复杂度:密钥管理的复杂度
  5. 合规要求:行业法规和标准的要求

实际生产运维场景

企业级数据加密部署

场景:大型企业环境,需要保护敏感数据,如客户信息、财务数据等。

处理步骤:

  1. 评估加密需求

    • 识别需要保护的敏感数据
    • 确定加密范围和加密方式
    • 评估性能影响
  2. 选择加密方式

    • 对于整个数据库的保护,使用透明数据加密 (TDE)
    • 对于敏感列的保护,使用 Always Encrypted 或列级加密
    • 对于备份数据的保护,使用备份加密
  3. 部署加密解决方案

    • 配置 TDE 证书和密钥
    • 启用数据库加密
    • 配置列级加密或 Always Encrypted
    • 配置备份加密
  4. 管理密钥

    • 定期备份证书和密钥
    • 定期轮换密钥
    • 限制密钥的访问权限
    • 建立密钥恢复流程
  5. 监控和维护

    • 监控加密状态
    • 监控性能影响
    • 定期审计加密配置
    • 测试加密数据的可恢复性

合规要求下的数据加密

场景:金融行业,需要满足 PCI DSS 等合规要求,保护敏感数据。

处理步骤:

  1. 了解合规要求

    • 研究 PCI DSS 等合规要求对数据加密的规定
    • 确定需要保护的敏感数据类型
  2. 选择合适的加密方式

    • 对于信用卡号等敏感数据,使用 Always Encrypted
    • 对于整个数据库,使用 TDE
    • 对于备份数据,使用备份加密
  3. 部署加密解决方案

    • 配置 Always Encrypted 保护敏感列
    • 启用 TDE 保护整个数据库
    • 配置备份加密保护备份数据
  4. 审计和合规检查

    • 定期审计加密配置,确保符合合规要求
    • 记录加密密钥的管理和使用
    • 准备合规检查所需的文档
  5. 持续改进

    • 关注新的加密技术和合规要求
    • 定期更新加密配置
    • 测试加密解决方案的有效性

总结

数据加密是 SQL Server 安全的重要组成部分,它保护数据在存储过程中的安全性,防止数据泄露和未授权访问。SQL Server 提供了多种数据加密功能,包括透明数据加密 (TDE)、列级加密、备份加密和 Always Encrypted 等,可以根据业务需求选择合适的加密方式。

合理的数据加密部署需要考虑业务需求、性能影响、应用程序修改和管理复杂度等因素。通过采用最佳实践和利用 SQL Server 提供的加密功能,可以构建一个安全、可靠的数据库环境,保护敏感数据的安全性,满足合规要求。