zoukankan      html  css  js  c++  java
  • 数据加密 第六篇:透明文件加密

    对于数据的保护,不仅需要控制数据的访问权限,还需要保护存储数据的文件。除了在操作系统层面对文件进行访问控制之外,还要确保文件被窃取后依然可以保护数据不泄露,这就需要对文件进行加密。即使文件被窃取,如果不能对文件进行解密,那么数据也是安全的。

    对于数据的加密,可以使用证书、对称密钥和非对称密钥,这三种加密机制都是用于保护数据,即使数据被窃取,如果没有解密的密钥,那么数据依旧不可用。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的层次结构

    TDE使用master数据库中的证书或EKM中非对称密钥来保护DEK,使用DEK来加密和解密数据。

    启用数据库的TDE功能,主要分三步来实现,第一步:在master书库中,创建服务主密钥和证书,其实证书是由服务主密钥来保护的。

    USE master;
    GO
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>';
    go
    CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate';
    go

    第二步:切换到特定的数据库中,创建DEK,并使用证书来保护DEK,DEK用于对数据文件进行加密和解密:

    USE AdventureWorks2012;
    GO
    CREATE DATABASE ENCRYPTION KEY
    WITH ALGORITHM = AES_128
    ENCRYPTION BY SERVER CERTIFICATE MyServerCert;
    GO

    第三步:启用数据库加密,SQL Server会扫描全部数据库文件,读取数据之后,对数据进行加密,然后把加密之后的数据重新写入到数据库文件中。

    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数据扫描

    为了启用数据库的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;

    五,对加密数据库的维护

    在启用TDE的数据库中,加密和解密使用的是证书,如果证书丢失或者损坏,那么数据库文件基本上就没法使用了,所以必须要备份证书。

    BACKUP CERTIFICATE TDECert 
    TO FILE = 'C:certificatesTDECert' 
    WITH PRIVATE KEY (file='C:certificatesTDECertKey', 
    ENCRYPTION BY PASSWORD='Pa$$w0rd') ;

    如果把加密数据库迁移到其他的服务器上,需要还原解密的密钥:SMK和证书。

    在新实例中,创建一个相同密码的服务主密钥,把证书还原到新实例中。

    USE master
    GO
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ; 
    GO 
    CREATE CERTIFICATE TDECert 
    FROM FILE = 'C:CertificatesTDECert' 
    WITH PRIVATE KEY 
    ( 
    FILE = 'C:CertificatesTDECertKey', 
    DECRYPTION BY PASSWORD = 'Pa$$w0rd' 
    ) ; 

    参考文档:

    Transparent Data Encryption (TDE)

  • 相关阅读:
    浏览器 显示flash问题
    类型参数的约束
    C# FUNC 应用
    c#抽奖系统
    3D基础数学小结
    google应用之字体引用
    MYSQL启动参数
    chrome中你不知道的快捷方式
    SQL Server 2008在添加用户时弹出15195错误
    Hibernate Maven Missing artifact javax.transaction:jta:jar:1.0.1B
  • 原文地址:https://www.cnblogs.com/ljhdo/p/4602777.html
Copyright © 2011-2022 走看看