前幾天研究了一下sql數據庫的透明加密,記下來加深一下理解.
用腳本創建文件夾
1 --查文件夾有沒有 2 EXEC master.dbo.xp_fileexist 'D:\DATA\storedcerts' 3 EXEC master.dbo.xp_fileexist 'D:\DATA\storedkeys' 4 5 --開啟系統存儲過程高級選項 6 EXEC sp_configure 'show advanced options',1 7 GO 8 RECONFIGURE 9 GO 10 EXEC sp_configure 'xp_cmdshell',1 11 RECONFIGURE 12 GO 13 --調用DOS命令創建storedcerts文件夾 14 EXEC xp_cmdshell 'mkdir D:\DATA\storedcerts' 15 GO 16 --調用DOS命令創建storedkeys文件夾 17 EXEC xp_cmdshell 'mkdir D:\DATA\storedkeys'
下面開始加密
1 USE MASTER; 2 GO 3 --刪除原有的證書和密鑰,保險一點,如果沒有會報錯不用管 4 DROP CERTIFICATE MyServerCert 5 GO 6 DROP MASTER KEY 7 GO 8 9 --在MASTER數據庫中創建一個MASTER KEY,密碼是zz.www 10 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'zz.www'; 11 GO 12 13 --使用MASTER KEY創建證書MyServerCert 14 CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate'; 15 GO 16 17 USE ceshi; 18 GO 19 --在ceshi數據庫上使用MyServerCert這個證書創建數據庫私鑰 20 CREATE DATABASE ENCRYPTION KEY 21 WITH ALGORITHM = AES_128 22 ENCRYPTION BY SERVER CERTIFICATE MyServerCert; 23 GO
接下來是備份數據庫主密鑰,數據庫證書和證書私鑰.
在創建證書時數據庫會提示備份證書以及相關私鑰,在沒弄明白之前筆者只備份了證書,沒有管私鑰,雖然私鑰是會在備份證書的時候帶到證書里面去,但是顯然筆者把證書想簡單了,等還原證書解密的時候,才發現數據庫主密鑰和證書私鑰是兩碼事,后面解密的時候解釋這個問題
1 USE MASTER; 2 GO 3 --備份數據庫主密鑰MASTER KEY 4 BACKUP MASTER KEY TO FILE = 'D:\DATA\storedkeys\masterkey' ENCRYPTION BY PASSWORD = 'zz.www' 5 GO 6 7 --備份數據庫證書和私鑰 8 BACKUP CERTIFICATE MyServerCert TO FILE = 'D:\DATA\storedcerts\MyServerCert.cer' 9 WITH PRIVATE KEY ( FILE = 'D:\DATA\storedkeys\MyServerCert.pvk' , 10 ENCRYPTION BY PASSWORD = 'zz.www' ); 11 GO 12 13 --將ceshi數據庫設置為加密 14 ALTER DATABASE ceshi SET ENCRYPTION ON; 15 GO
到這里ceshi數據庫就加密成功了.
下面是解密過程,筆者只是用到了把加密的數據庫的備份文件或者數據庫原文件還原或者附加到另外的實例數據庫中.
在這里就遇到了問題,剛開始筆者用備份好的密鑰和證書直接還原到新實例上面,提示都還原成功了,但是用備份文件進行還原的時候,還是會提示密鑰不對.
然后筆者嘗試刪除密鑰和證書,雖然提示筆者刪掉了,而且在系統表里面查詢也確實沒有了,但是在還原的時候依舊報錯,提示需要證書
找了下原因,官方說法:即使對於數據庫不再啟用加密,用於保護數據庫加密密鑰的證書備份也應保留。 即使數據庫不再加密,事務日志的某些部分仍可能保持受到保護,但在執行數據庫的完整備份前,對於某些操作可能需要證書。
說是刪除,實際上並沒有,也是,如果直接就刪了,那這透明加密就沒什么卵用了;也就是說即使密鑰刪了,但是證書還在,私鑰還在,即使是用DROP CERTIFICATE MyServerCert 來刪除證書,然后把當前數據庫拿到其他數據庫實例上面還原,也是無法成功的.
然后在還原好了主密鑰和證書,私鑰之后,數據庫卻提示當前數據庫實例不支持透明加密功能,這才知道,雖然大部分的數據庫版本均可以進行加密操作,但是在新實例上面做一些還原或者附加等操作的,必須要求新的數據庫實例是企業版的才可以完美操作.
1 --查詢數據庫實例版本等信息 2 SELECT SERVERPROPERTY('productversion') as '產品版本', SERVERPROPERTY ('productlevel') as '產品級別' , SERVERPROPERTY ('edition') as '版本'
下面是筆者總結的成功還原數據庫並且可以正常操作數據庫數據的解密方法
還原主密鑰,還原證書和證書私鑰,重點就是證書私鑰
1 --還原MASTER KEY 2 USE MASTER 3 RESTORE MASTER KEY 4 FROM FILE = 'D:\DATA\storedkeys\masterkey' 5 DECRYPTION BY PASSWORD = 'zz.www' 6 ENCRYPTION BY PASSWORD = 'zz.www'; 7 GO 8 9 --還原證書和私鑰 10 CREATE CERTIFICATE MyServerCert 11 FROM FILE = 'D:\DATA\storedcerts\MyServerCert' 12 WITH PRIVATE KEY (FILE = 'D:\DATA\storedkeys\MyServerCert.pvk', 13 DECRYPTION BY PASSWORD = 'zz.www'); 14 GO 15 16 --還原數據庫 17 RESTORE DATABASE ceshi 18 FROM disk = 'F:/DATA/2015-07-06' 19 WITH MOVE 'Test' TO 'd:\DATA\ceshi.mdf', 20 MOVE 'Test_log' TO 'd:\DATA\ceshi_log.ldf' 21 GO
到這里數據庫還原成功就ok了
此文個人觀點,有不對之處,歡迎指正.