[SQL]TDE (透明資料加密) 功能測試
前一陣子有朋友想了解資料庫加密的相關技術,當時沒有注意到能使用的版本,就介紹他使用 SQL Server 的 TDE ( 透明資料加密 ) 的方式,可以在不用修改程式的狀況下就可以直接使用,後來在測試的過程中才想到,一般的 Express 和 Standard 版本是沒有提供的,目前只有幾下幾個版本才有提供該功能
- SQL Server 2012 Enterprise, Developer, and Evaluation editions
- SQL Server 2008 R2 Datacenter, Enterprise, Developer, and Evaluation editions
- SQL Server 2008 Enterprise, Developer, and Evaluation editions
如果所使用的版本符合的話,則可以透過以下語法的方式來使用透明資料加密:
-- >> NOTE: 該範例必須在 SSMS 下使用 SQLCMD 模式執行. << -- :on error exit :setvar MasterKeyPassword "P@ssw0rd123" :setvar CertificateName "TaichungCertificate" :setvar CertificateSubject "TaichungCertificate" :setvar EncryptionDatabase "A004" -- 1. 建立 Master Key USE [master] CREATE MASTER KEY ENCRYPTION BY PASSWORD = '$(MasterKeyPassword)'; GO -- 2. 建立 Server 憑證 CREATE CERTIFICATE $(CertificateName) WITH SUBJECT = '$(CertificateSubject)', EXPIRY_DATE = '12/30/2100' GO -- 3. 在欲加密的資料庫下建立資料庫加密憑證 USE [$(EncryptionDatabase)] GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE $(CertificateName) GO -- 4. 設定資料庫加密 ALTER DATABASE $(EncryptionDatabase) SET ENCRYPTION ON GO
而再加密的過程,會隨著資料庫大小、CPU 能力和磁碟 I/O 的速度,而要花上不等的時間,如果要查看加密的處理狀態,則可以透過以下指令來查看
SELECT db_name(database_id) DBName, EncryptionState = CASE encryption_state WHEN 0 THEN 'No database encryption key present, no encryption' WHEN 1 THEN 'Unencrypted' WHEN 2 THEN 'Encryption in progress' WHEN 3 THEN 'Encrypted' WHEN 4 THEN 'Key change in progress' WHEN 5 THEN 'Key change in progress' WHEN 6 THEN 'Protection change in progress/' ELSE 'Un-recognized encryption status.' END FROM sys.dm_database_encryption_keys
而資料庫如果有加密之後,那麼就要注意到憑證的保留,如果要備份憑證的話,則可以使用以下的指令來進行
-- 備份憑證,並指定憑證加密的 Private Key 和 密碼 BACKUP CERTIFICATE TaichungCertificate TO FILE = 'D:\TDE\SQLServerCertificateFile.CER' WITH PRIVATE KEY (FILE='D:\TDE\SQLServerCertificateFile.PVK', ENCRYPTION BY PASSWORD='P@ssw0rd987') GO
因此這個時候我們如果有需要將備份檔案移到其他電腦上還原的時候,則目的端的電腦必須也要有該憑證才可以還原資料庫,因此我們將前面步驟所備份出來的 CER 和 PVK 檔案,複製到目的端電腦後,使用以下指令來進行還原,如果沒有先還原憑證的話,則加密的備份資料庫是沒有辦法還原成功的。
-- 在新電腦上也同樣先建立一個 Master Key CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd123'; GO -- 從備份檔案中還原憑證 CREATE CERTIFICATE TaichungCertificate FROM FILE='D:\TDE\Temp\SQLServerCertificateFile.CER' WITH PRIVATE KEY (FILE = 'D:\TDE\Temp\SQLServerCertificateFile.PVK', DECRYPTION BY PASSWORD='P@ssw0rd987') GO
雖然使用透明資料加密是很容易的,但要注意一下因為當使用之後,原本再搭配備份壓縮的時候都可以達到不錯的效果,再使用透明資料加密之後,原本可以達到七八成的壓縮比例,可能只會剩下只有兩三成的效果了。