在現實環境中,我們會遇到數據庫備份磁盤丟失或者被盜的情況,此時惡意破壞方只需還原或者附加數據庫即可瀏覽數據。接下來我將介紹透明數據加密(Transparent Data Encryption)的方法來保護你的數據庫。如果數據A,使用TDE加密之後,即時惡意破壞方有了備份磁盤,也不能還原或者附加,這是因爲數據庫使用了被證書保護的加密數據密鑰。在沒有安裝證書的情況下,通過任何文件(MDF,LDF,bak...)都不是不能還原的.
1.什麼是TDE
透明數據庫加密可對數據和日誌文件執行實時I/O加密和解密.這種加密使用數據庫加密密鑰(Data Encrtyption Key),DEK是使用存儲在服務器的master數據庫中的證書保護的對稱密碼,或者是由EKM模塊保護的非對稱密鑰.使用(Advanced Encryption Standard)或者3DES(Data Encryption Standard)加密算法來加密數據,並且無需更改現有應用程序.
2.如何使用TDE
1.創建主密鑰
2.創建或者獲取由該密鑰保護的證書
3.創建數據庫加密密鑰並且由該證書保護該密鑰
4.將數據庫設置爲可加密
下面通實例對TEST DB進行TDE加密
--Create a master key
USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '~qaz123[]\';
GO
--Create a certificate
CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate';
GO
--Create a database encryption key and protect it by the certificate
USE TEST
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE MyServerCert;
GO
--Set the database to use encryption
USE TEST
ALTER DATABASE TEST
SET ENCRYPTION ON;
GO
當你完成上面的操作之後,接下來驗證下加密數據的詳細信息
SELECT DB_NAME(database_id) AS DatabaseName, * FROM sys.dm_database_encryption_keys
此時你會發現除了TEST DB 外還有tempdb DB,這是因爲只有你對任一數據庫加密的時候,也會自動的爲tempdb 加密3.查看TDE是否起作用
在另外一臺Server上面使用bak文件來還原TEST數據庫
RESTORE DATABASE TEST
FROM DISK = 'E:\數據庫\測試數據庫\TEST.bak'
WITH MOVE 'TEST' TO 'E:\\數據庫\測試數據庫\TEST.mdf',
MOVE 'TEST_log' TO 'E:\數據庫\測試數據庫\TEST.ldf',
NOUNLOAD, REPLACE
執行完上面的代碼之後Message如下
Msg 33111, Level 16, State 3, Line 1
Cannot find server certificate with thumbprint '0x739E848FD2ECB7D945D39B7836BCD65B55D75D43'.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.
你使用附加數據庫結果也是一樣的,怎麼解決這個問題了,使用添加同樣的證書在這臺Server
在添加該證書到這臺Server之前,先在以前的Server上面備份證書到文件(其實這個操作我在添加證書的時候已經做啦)
代碼如下
--backup certificate nad primary key to file
USE master
GO
BACKUP CERTIFICATE MyServerCert TO FILE = 'D:\Test DB\Test\MyServerCert.cert'
WITH PRIVATE KEY (
FILE = 'D:\Test DB\Test\MyServerCertPrivate.key',
ENCRYPTION BY PASSWORD = '~qaz123[]\');
GO
備份成功之後,使用備份成功的證書,在目標Server上面創建證書
USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '~qaz123[]\';
GO
USE master
GO
CREATE CERTIFICATE MyServerCert
FROM FILE = 'E:\學習\數據庫\測試數據庫\MyServerCert.cert'
WITH PRIVATE KEY (
FILE = 'E:\學習\數據庫\測試數據庫\MyServerCertPrivate.key'
, DECRYPTION BY PASSWORD = '~qaz123[]\')
GO
創建成功,查詢下證書是否創建成功
SELECT * FROM sys.certificates where name = 'MyServerCert'
現在再次還原數據庫
RESTORE DATABASE TEST
FROM DISK = 'E:\數據庫\測試數據庫\TEST.bak'
WITH MOVE 'TEST' TO 'E:\\數據庫\測試數據庫\TEST.mdf',
MOVE 'TEST_log' TO 'E:\數據庫\測試數據庫\TEST.ldf',
NOUNLOAD, REPLACE
此時數據庫還原成功,大功告成!