透明數(shù)據(jù)加密(TDE)庫的備份和還原
更新時間:2012年07月17日 22:08:31 作者:
對于包含敏感數(shù)據(jù)的庫,要實現(xiàn)備份加密。即備份文件別人拿到也不能還原和查看其中的數(shù)據(jù)
想到TDE(Transparent Data Encryption)。
TDE MSDN 說明:
“透明數(shù)據(jù)加密”(TDE) 可對數(shù)據(jù)和日志文件執(zhí)行實時 I/O 加密和解密。這種加密使用數(shù)據(jù)庫加密密鑰 (DEK),該密鑰存儲在數(shù)據(jù)庫引導(dǎo)記錄中以供恢復(fù)時使用。DEK 是使用存儲在服務(wù)器的 master 數(shù)據(jù)庫中的證書保護的對稱密鑰,或者是由 EKM 模塊保護的非對稱密鑰。TDE 保護“處于休眠狀態(tài)”的數(shù)據(jù),即數(shù)據(jù)和日志文件。它提供了遵從許多法律、法規(guī)和各個行業(yè)建立的準則的能力。軟件開發(fā)人員籍此可以使用 AES 和 3DES 加密算法來加密數(shù)據(jù),且無需更改現(xiàn)有的應(yīng)用程序。
其實吸引我的是“無需更改現(xiàn)有的應(yīng)用程序”,因為我需要加密的庫服務(wù)于一個非常穩(wěn)定的系統(tǒng),而且這樣做所有事情DBA可控。
TDE加密體系結(jié)構(gòu):

測試過程:
--創(chuàng)建主密鑰(Master Key)
USE master
GO
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD=N'1qaz@WSX';
GO
--備份主密鑰
BACKUP MASTER KEY TO FILE=N'C:\master_key.cer'
ENCRYPTION BY PASSWORD=N'!QAZ2wsx'
GO
--創(chuàng)建基于主密鑰的證書。用于保護數(shù)據(jù)庫加密密鑰(Database Encryption Key)
--DROP CERTIFICATE SDB_Cert
CREATE CERTIFICATE SDB_Cert
WITH SUBJECT=N'Certificate for SecretDB'
go
--使用私鑰加密的方式備份主密鑰的證書
BACKUP CERTIFICATE SDB_Cert
TO FILE=N'C:\SDB_Cert.cer'
WITH PRIVATE KEY
(
FILE =N'C:\SDB_Cert.pvk',
ENCRYPTION BY PASSWORD='!QAZ2wsx'
)
GO
--創(chuàng)建測試庫SecretDB
USE master
GO
CREATE DATABASE SecretDB
GO
USE SecretDB
GO
CREATE TABLE SDB_TB
(ID INT,VAL NVARCHAR(20));
INSERT INTO SDB_TB
VALUES (1,N'A'),(2,N'B'),(3,N'C');
GO
USE SecretDB
go
--創(chuàng)建數(shù)據(jù)庫加密密鑰
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM=AES_128
ENCRYPTION BY SERVER CERTIFICATE SDB_Cert;
GO
--啟用數(shù)據(jù)庫加密
USE SecretDB
go
ALTER DATABASE SecretDB SET ENCRYPTION ON
go
--備份SecretDB,用于后續(xù)的異機還原測試
USE master
go
BACKUP DATABASE SecretDB TO DISK=N'D:\SecretDB.bak'
go
在完成這些后,SecretDB庫已經(jīng)加密,并且得到其加密后的備份文件,接下來需要在另臺還原這個備份。
我把SecretDB.bak,SDB_Cert.cer,SDB_Cert.pvk拷到別一臺機。直接還原的話,會報錯。需要創(chuàng)建原來用于加密的證書來還原數(shù)據(jù)庫備份。我的目的達到了!
--在異機上恢復(fù)SecretDB的備份
USE master
GO
CREATE DATABASE SecretDB
GO
RESTORE DATABASE SecretDB
FROM DISK=N'D:\SecretDB.bak'
WITH REPLACE
GO
--消息 33111,級別 16,狀態(tài) 3,第 1 行
--找不到指紋為 '0x0106000000000009010000009C529FFD5C7FD72FD0AAE9EDF46C5F69946FFED0' 的服務(wù)器 證書。
--消息 3013,級別 16,狀態(tài) 1,第 1 行
--RESTORE DATABASE 正在異常終止。
創(chuàng)建證書并還原。
USE master
GO
CREATE CERTIFICATE SDB_Cert
FROM FILE=N'C:\SDB_Cert.cer'
WITH PRIVATE KEY
(
FILE=N'C:\SDB_Cert.pvk',
DECRYPTION BY PASSWORD=N'!QAZ2wsx'
)
GO
RESTORE DATABASE SecretDB
FROM DISK=N'D:\SecretDB.bak'
WITH REPLACE
GO
總結(jié):
其實在做TDE前應(yīng)該仔細閱讀BOL的說明:ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_4deptrbl/html/c75d0d4b-4008-4e71-9a9d-cee2a566bd3b.htm
其中說到:
如果使用 TDE 對數(shù)據(jù)庫進行加密,備份壓縮將無法顯著壓縮備份存儲。
復(fù)制不會以加密形式從啟用了 TDE 的數(shù)據(jù)庫中自動復(fù)制數(shù)據(jù)。如果您想保護分發(fā)和訂閱服務(wù)器數(shù)據(jù)庫,則必須單獨啟用 TDE。
某些限制和注意事項,會影響TDE的部署和使用。
TDE MSDN 說明:
“透明數(shù)據(jù)加密”(TDE) 可對數(shù)據(jù)和日志文件執(zhí)行實時 I/O 加密和解密。這種加密使用數(shù)據(jù)庫加密密鑰 (DEK),該密鑰存儲在數(shù)據(jù)庫引導(dǎo)記錄中以供恢復(fù)時使用。DEK 是使用存儲在服務(wù)器的 master 數(shù)據(jù)庫中的證書保護的對稱密鑰,或者是由 EKM 模塊保護的非對稱密鑰。TDE 保護“處于休眠狀態(tài)”的數(shù)據(jù),即數(shù)據(jù)和日志文件。它提供了遵從許多法律、法規(guī)和各個行業(yè)建立的準則的能力。軟件開發(fā)人員籍此可以使用 AES 和 3DES 加密算法來加密數(shù)據(jù),且無需更改現(xiàn)有的應(yīng)用程序。
其實吸引我的是“無需更改現(xiàn)有的應(yīng)用程序”,因為我需要加密的庫服務(wù)于一個非常穩(wěn)定的系統(tǒng),而且這樣做所有事情DBA可控。
TDE加密體系結(jié)構(gòu):

測試過程:
復(fù)制代碼 代碼如下:
--創(chuàng)建主密鑰(Master Key)
USE master
GO
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD=N'1qaz@WSX';
GO
--備份主密鑰
BACKUP MASTER KEY TO FILE=N'C:\master_key.cer'
ENCRYPTION BY PASSWORD=N'!QAZ2wsx'
GO
--創(chuàng)建基于主密鑰的證書。用于保護數(shù)據(jù)庫加密密鑰(Database Encryption Key)
--DROP CERTIFICATE SDB_Cert
CREATE CERTIFICATE SDB_Cert
WITH SUBJECT=N'Certificate for SecretDB'
go
--使用私鑰加密的方式備份主密鑰的證書
BACKUP CERTIFICATE SDB_Cert
TO FILE=N'C:\SDB_Cert.cer'
WITH PRIVATE KEY
(
FILE =N'C:\SDB_Cert.pvk',
ENCRYPTION BY PASSWORD='!QAZ2wsx'
)
GO
--創(chuàng)建測試庫SecretDB
USE master
GO
CREATE DATABASE SecretDB
GO
USE SecretDB
GO
CREATE TABLE SDB_TB
(ID INT,VAL NVARCHAR(20));
INSERT INTO SDB_TB
VALUES (1,N'A'),(2,N'B'),(3,N'C');
GO
USE SecretDB
go
--創(chuàng)建數(shù)據(jù)庫加密密鑰
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM=AES_128
ENCRYPTION BY SERVER CERTIFICATE SDB_Cert;
GO
--啟用數(shù)據(jù)庫加密
USE SecretDB
go
ALTER DATABASE SecretDB SET ENCRYPTION ON
go
--備份SecretDB,用于后續(xù)的異機還原測試
USE master
go
BACKUP DATABASE SecretDB TO DISK=N'D:\SecretDB.bak'
go
在完成這些后,SecretDB庫已經(jīng)加密,并且得到其加密后的備份文件,接下來需要在另臺還原這個備份。
我把SecretDB.bak,SDB_Cert.cer,SDB_Cert.pvk拷到別一臺機。直接還原的話,會報錯。需要創(chuàng)建原來用于加密的證書來還原數(shù)據(jù)庫備份。我的目的達到了!
--在異機上恢復(fù)SecretDB的備份
USE master
GO
CREATE DATABASE SecretDB
GO
RESTORE DATABASE SecretDB
FROM DISK=N'D:\SecretDB.bak'
WITH REPLACE
GO
--消息 33111,級別 16,狀態(tài) 3,第 1 行
--找不到指紋為 '0x0106000000000009010000009C529FFD5C7FD72FD0AAE9EDF46C5F69946FFED0' 的服務(wù)器 證書。
--消息 3013,級別 16,狀態(tài) 1,第 1 行
--RESTORE DATABASE 正在異常終止。
創(chuàng)建證書并還原。
USE master
GO
CREATE CERTIFICATE SDB_Cert
FROM FILE=N'C:\SDB_Cert.cer'
WITH PRIVATE KEY
(
FILE=N'C:\SDB_Cert.pvk',
DECRYPTION BY PASSWORD=N'!QAZ2wsx'
)
GO
RESTORE DATABASE SecretDB
FROM DISK=N'D:\SecretDB.bak'
WITH REPLACE
GO
總結(jié):
其實在做TDE前應(yīng)該仔細閱讀BOL的說明:ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_4deptrbl/html/c75d0d4b-4008-4e71-9a9d-cee2a566bd3b.htm
其中說到:
如果使用 TDE 對數(shù)據(jù)庫進行加密,備份壓縮將無法顯著壓縮備份存儲。
復(fù)制不會以加密形式從啟用了 TDE 的數(shù)據(jù)庫中自動復(fù)制數(shù)據(jù)。如果您想保護分發(fā)和訂閱服務(wù)器數(shù)據(jù)庫,則必須單獨啟用 TDE。
某些限制和注意事項,會影響TDE的部署和使用。
相關(guān)文章
通過navicat連接SQL?Server數(shù)據(jù)庫的詳細步驟
本文介紹如何通過navicat連接SQL?Server數(shù)據(jù)庫,以往總是使SQL?Server客戶端來連接SQL?Server數(shù)據(jù)庫,但是SQL?Server客戶端一般有幾百M的大小,而且安裝繁瑣配置麻煩,如果可以通過Navicat直接連接SQL?Server則會非常輕松方便,需要的朋友可以參考下2023-12-12解決Navicat連接本地sqlserver數(shù)據(jù)庫成功后沒有庫表數(shù)據(jù)的問題
本文主要給大家介紹了如何解決Navicat連接本地sqlserver數(shù)據(jù)庫成功后沒有庫表數(shù)據(jù)的問題,文中有詳細的原因分析和解決方法,具有一定的參考價值,需要的朋友可以參考下2023-10-10SQL學(xué)習(xí)筆記五去重,給新加字段賦值的方法
SQL學(xué)習(xí)筆記五去重,給新加字段賦值的方法,需要的朋友可以參考下。2011-08-08如何恢復(fù)SQL Server 2000損壞的數(shù)據(jù)庫文件
在現(xiàn)實情況中由于硬件和軟件的原因可能導(dǎo)致數(shù)據(jù)庫文件損壞,那么損壞的數(shù)據(jù)庫文件有沒有辦法修復(fù)呢?下面講講如何恢復(fù)SQL Server 2000損壞的數(shù)據(jù)庫文件2014-01-01SQL?Server主鍵與外鍵設(shè)置以及相關(guān)理解
在數(shù)據(jù)庫的學(xué)習(xí)中對于一個表的主鍵和外鍵的認識是非常重要的,下面這篇文章主要給大家介紹了關(guān)于SQL?Server主鍵與外鍵設(shè)置以及相關(guān)理解的相關(guān)資料,需要的朋友可以參考下2022-10-10數(shù)據(jù)庫SQL中having和where的用法區(qū)別
這篇文章主要介紹了數(shù)據(jù)庫SQL中having和where的用法區(qū)別的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11