加密是一種安全措施,有時候甚至是法律要求。做爲攻破Windows系統的最後一道防線,經過加密能夠保證在沒有密鑰的狀況下獲取備份或者物理介質變得毫無心義。算法
加密層次結構sql
加密層次結構的每一層是如何對它下面的一層進行加密的,而且顯示了最經常使用的加密配置。對層次結構的開始進行的訪問一般受密碼保護。SQL Server 用分層加密和密鑰管理基礎結構來加密數據。每一層都使用證書、非對稱密鑰和對稱密鑰的組合對它下面的一層進行加密。非對稱密鑰和對稱密鑰能夠存儲在 SQL Server 以外的可擴展密鑰管理 (EKM) 模塊中。數據庫
注意:安全
爲了得到最佳性能,使用對稱密鑰(而不是證書或非對稱密鑰)加密數據。服務器
數據庫主密鑰受服務主密鑰保護。 服務主密鑰由 SQL Server 安裝程序建立,而且使用 Windows 數據保護 API (DPAPI) 進行加密。架構
堆疊其餘層的其餘加密層次結構是可能的。函數
可擴展密鑰管理 (EKM) 模塊將對稱密鑰或非對稱密鑰保存在 SQL Server 的外部。性能
透明數據加密 (TDE) 必須使用稱爲數據庫加密密鑰的對稱密鑰,該密鑰受由 master 數據庫的數據庫主密鑰保護的證書保護,或者受存儲在 EKM 中的非對稱密鑰保護。測試
服務主密鑰和全部數據庫主密鑰是對稱密鑰。加密
每個實例只有一個服務主密鑰,服務主密鑰用於加密數據庫主密鑰,服務主密鑰爲 SQL Server 加密層次結構的根。服務主密鑰是首次須要它來加密其餘密鑰時自動生成的。默認狀況下,服務主密鑰使用 Windows 數據保護 API 和本地計算機密鑰進行加密。只有建立服務主密鑰的 Windows 服務賬戶或有權訪問服務賬戶名稱和密碼的主體可以打開服務主密鑰。
---備份服務主密鑰 BACKUP SERVICE MASTER KEY TO FILE = 'D:\DECRYPTION\ServerMasterKey' ENCRYPTION BY PASSWORD = 'password' ----還原服務主密鑰 RESTORE SERVICE MASTER KEY FROM FILE = 'D:\DECRYPTION\ServerMasterKey' DECRYPTION BY PASSWORD = 'password' [FORCE]; ----即便存在數據丟失的風險,也要強制替換服務主密鑰。
注意:
1.服務主密鑰直接或間接地保護樹中的全部其餘密鑰。若是在強制的還原過程當中不能對某個相關密鑰進行解密,則由該密鑰所保護的數據便會丟失。
2.從新生成加密層次結構是一種消耗大量資源的操做。您應當將該操做安排在資源需求較低的時段進行。
3.當還原服務主密鑰時,SQL Server 將對全部已使用當前服務主密鑰加密的密鑰和機密內容進行解密,而後使用從備份文件中加載的服務主密鑰對這些密鑰和機密內容進行加密。
數據庫主密鑰建立於對應數據庫下,具體的保護對象能夠參考下面的數據庫範圍的安全對象。若是要對數據庫備份或者透明數據庫加密那麼須要將服務主密鑰建立於Master數據庫下。
----1.建立數據庫主密鑰 USE [master] GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MasterKey' ---2.刪除數據庫主密鑰 DROP MASTER KEY ---3.備份數據庫主密鑰 /* 主密鑰必須爲打開狀態,所以在備份主密鑰以前應對其進行解密。若是主密鑰使用服務主密鑰進行加密,則沒必要顯式打開。但若是主密鑰僅使用密碼進行加密,則必須顯式打開。 建議在建立主密鑰以後當即對其進行備份,並存儲於另一個安全的位置中。 */ OPEN MASTER KEY DECRYPTION BY PASSWORD = 'MasterKey'; ---打開數據庫主密鑰,這裏的密碼爲建立主密鑰時設的密碼 BACKUP MASTER KEY TO FILE = 'D:\DECRYPTION\MasterKey' -----主密鑰私鑰文件 ENCRYPTION BY PASSWORD = 'MasterKey'; -----加密主密鑰私鑰文件 GO ---4.還原數據庫主密鑰 /* 還原主密鑰以後,SQL Server 會對使用當前活動的主密鑰加密的全部密鑰進行解密,而後使用還原後的主密鑰對這些密鑰進行加密。這種大量消耗資源的操做應當安排在資源需求較低的時段執行。若是當前的數據庫主密鑰未打開或沒法打開,或者沒法對任何使用該主密鑰加密的密鑰進行解密,則還原操做將失敗。 若是當前數據庫中沒有主密鑰,則 RESTORE MASTER KEY 將建立一個主密鑰。新的主密鑰不會自動使用服務主密鑰進行加密。 請僅在主密鑰沒法恢復或解密失敗時,才使用 FORCE 選項。僅由不可恢復密鑰加密的信息將會丟失。 若是主密鑰經過服務主密鑰進行加密,則還原後的主密鑰也經過該服務主密鑰進行加密(當前服務器)。 */ RESTORE MASTER KEY FROM FILE = 'C:\DECRYPTION\MasterKey' DECRYPTION BY PASSWORD = N'MasterKey' ENCRYPTION BY PASSWORD = 'MasterKey123' ---加密導出的主密鑰 --force; ----指定即便當前數據庫主密鑰未打開,或者 SQL Server 沒法對使用該主密鑰加密的某些私鑰進行解密,RESTORE 過程也應繼續執行。 GO ---5.打開數據庫主密鑰 OPEN MASTER KEY DECRYPTION BY PASSWORD = N'MasterKey123' GO
注意:
1.數據庫主密鑰是指用於保護證書私鑰的對稱密鑰以及數據庫中存在的非對稱密鑰。當建立主密鑰時,會使用 Triple DES 算法以及用戶提供的密碼對其進行加密。
2.請使用服務主密鑰對該主密鑰的副本進行加密,並將副本存儲在數據庫和 master 中。一般,每當主密鑰更改時,便會在不進行提示的狀況下更新存儲在 master 中的副本。
3.在當前服務器下建立的數據庫主密鑰默認就使用了服務主密鑰加密和自動解密,沒必要使用 OPEN MASTER KEY 語句。若是還原到了新的服務器那麼服務主密鑰則不存在.必須使用 OPEN MASTER KEY 語句解密數據庫主密鑰。一旦數據庫主密鑰解密後,經過使用 ALTER MASTER KEY 語句向服務器提供數據庫主密鑰(使用服務主密鑰加密)的副本,便可擁有未來啓用自動解密的選項。
4.經過使用帶 DROP ENCRYPTION BY SERVICE MASTER KEY 選項的 ALTER MASTER KEY 語句,可從自動密鑰管理中排除特定數據庫的數據庫主密鑰。而後,必須顯式打開帶密碼的數據庫主密鑰。
5.數據庫主密鑰使用公鑰對證書、非對稱密鑰進行加密,使用私鑰進行解密,若是在當前建立的服務器上默認自動解密,若是還原到一臺新的服務上時可能須要使用OPEN MASTER KEY進行解密。
證書使用公鑰對安全對象進行加密,使用私鑰進行解密,默認證書存在就自動解密。
----1.建立自我簽名的證書,使用數據庫主密鑰進行加密證書 USE MASTER; GO CREATE CERTIFICATE MyCerts WITH SUBJECT = 'BackDB Records', EXPIRY_DATE = '10/31/2099'; ----證書過時時間,不指定開始時間默認開始時間爲當前時間 GO ---使用密碼進行加密證書 USE MASTER; GO CREATE CERTIFICATE CertsByPW ENCRYPTION BY PASSWORD = 'CertsByPW111' WITH SUBJECT = 'BackDB Records', EXPIRY_DATE = '10/31/2099'; ----證書過時時間,不指定開始時間默認開始時間爲當前時間 GO ----2.備份證書 ----警告: 用於對數據庫加密密鑰進行加密的證書還沒有備份。應當當即備份該證書以及與該證書關聯的私鑰。若是該證書不可用,或者您必須在另外一臺服務器上還原或附加數據庫,則必須對該證書和私鑰均進行備份,不然將沒法打開該數據庫。 BACKUP CERTIFICATE MyCerts TO FILE = 'D:\DECRYPTION\MyCerts' ----證書文件 WITH PRIVATE KEY ( FILE = 'D:\DECRYPTION\MyCertsKey' , ----證書私鑰文件 ENCRYPTION BY PASSWORD = 'MyCerts123' ); ----對私鑰文件加密 GO ---備份使用私鑰進行加密的證書,必須先對私鑰進行解密 BACKUP CERTIFICATE CertsByPW TO FILE = 'D:\DECRYPTION\MyCerts' ----證書文件 WITH PRIVATE KEY ( DECRYPTION BY PASSWORD = 'CertsByPW111',----解密證書 FILE = 'D:\DECRYPTION\MyCertsKey' , ----證書私鑰文件 ENCRYPTION BY PASSWORD = 'MyCerts123' ); ----對私鑰文件加密 GO ----3.經過備份文件建立證書,還原證書, CREATE CERTIFICATE MyCerts FROM FILE = 'C:\DECRYPTION\MyCerts' ----證書文件 WITH PRIVATE KEY ( FILE = 'C:\DECRYPTION\MyCertsKey' , ----證書私鑰文件 DECRYPTION BY PASSWORD = 'MyCerts123' ); ----解密私鑰文件 ---4.刪除證書 DROP CERTIFICATE MyCerts
注意:
當使用數據庫主密鑰對私鑰進行加密時,不須要 ENCRYPTION BY PASSWORD 選項。
只有在使用密碼對私鑰進行加密時,才使用該選項。
若是未指定密碼,則使用數據庫主密鑰對證書的私鑰進行加密。 若是數據庫主密鑰沒法打開,則省略該子句會致使錯誤。
「非對稱密鑰」是數據庫級的安全對象實體。該實體的默認格式包含公鑰和私鑰。當未使用 FROM 子句執行時,CREATE ASYMMETRIC KEY 會生成新的密鑰對。當使用 FROM 子句執行時,CREATE ASYMMETRIC KEY 會從文件中導入密鑰對,或從程序集中導入公鑰。
默認狀況下,私鑰受數據庫主密鑰保護。若是還沒有建立任何數據庫主密鑰,則須要使用密碼保護私鑰。若是不存在數據庫主密鑰,則能夠選擇性地使用密碼。
一般使用RSA加密算法,RSA_5十二、RSA_102四、RSA_2048。
---1.建立非對稱密鑰;非對稱密鑰能夠由密碼、數據庫主密鑰、EKM模塊加密 --使用密碼加密 CREATE ASYMMETRIC KEY AsymmetricByPW WITH ALGORITHM = RSA_2048 ---使用RSA_2048加密算法 ENCRYPTION BY PASSWORD = 'AsymmetricByPW111'; GO --2.經過文件建立非對稱密鑰 CREATE ASYMMETRIC KEY AsymmetricByFile AUTHORIZATION Christina ----授予Christina用戶使用該非對稱密鑰 FROM FILE = 'c:\PacSales\Managers\ChristinaCerts.tmp' ENCRYPTION BY PASSWORD = 'AsymmetricByFile111'; GO ---3.使用數據庫主密鑰加密 CREATE ASYMMETRIC KEY AsymmetricByMasterKey WITH ALGORITHM = RSA_2048; ---使用RSA_2048加密算法 ---4.刪除非對稱密鑰 DROP ASYMMETRIC KEY AsymmetricByPW GO
建立對稱密鑰時,必須至少使用如下項之一來對該對稱密鑰進行加密:證書、密碼、對稱密鑰、非對稱密鑰或 PROVIDER。可以使用上述每種類型中的多項對密鑰進行加密。換言之,能夠同時使用多個證書、密碼、對稱密鑰以及非對稱密鑰對單個對稱密鑰進行加密
一般使用AES算法,有AES_12八、AES_19二、AES_256
--1.建立對稱密鑰,對稱密鑰能夠由密碼、非對稱密鑰、對稱密鑰、EKM模塊加密 ---使用密碼加密 CREATE SYMMETRIC KEY SymmetricByPW WITH ALGORITHM = AES_256 ENCRYPTION BY PASSWORD = 'SymmetricByPW111'; GO --注意:當使用密碼(而不是數據庫主密鑰的公鑰)對對稱密鑰進行加密時,便會使用 TRIPLE DES 加密算法。所以,用強加密算法(如 AES)建立的密鑰自己受較弱算法的保護。 ---2.使用證書加密 CREATE SYMMETRIC KEY SymmetricByCert WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE MyCerts; ---3.刪除非對稱密鑰 DROP SYMMETRIC KEY TestSymmetric GO
安全對象是 SQL Server 數據庫引擎受權系統控制對其進行訪問的資源。經過建立能夠爲本身設置安全性的名爲「範圍」的嵌套層次結構,能夠將某些安全對象包含在其餘安全對象中。安全對象範圍有服務器、數據庫和架構。
包含如下安全對象:
包含如下安全對象:
包含如下安全對象:
下面是對象類的成員:
經過使用證書加密備份,若是須要在新的服務器上還原備份,先還原數據庫主密鑰和證書,而後就能夠自動解密還原備份。
--1.備份數據庫主密鑰 BACKUP MASTER KEY TO FILE = 'D:\DECRYPTION\MasterKey' -----主密鑰私鑰文件 ENCRYPTION BY PASSWORD = 'MasterKey'; -----加密主密鑰私鑰文件 GO --2.備份證書 BACKUP CERTIFICATE MyCerts TO FILE = 'D:\DECRYPTION\MyCerts' ----證書文件 WITH PRIVATE KEY ( FILE = 'D:\DECRYPTION\MyCertsKey' , ----證書私鑰文件 ENCRYPTION BY PASSWORD = 'MyCerts123' ); ----對私鑰文件加密 GO --3.備份數據庫 USE MASTER GO BACKUP DATABASE [EncryDb] TO DISK = N'D:\BackDB\EncryDb.bak' WITH COMPRESSION, stats = 10, ENCRYPTION ( ALGORITHM = AES_256, SERVER CERTIFICATE = MyCerts ) GO ---4.在新服務器上還原數據庫主密鑰 USE MASTER GO RESTORE MASTER KEY FROM FILE = 'C:\DECRYPTION\MasterKey' DECRYPTION BY PASSWORD = N'MasterKey' ---解密主密鑰文件 ENCRYPTION BY PASSWORD = N'MasterKey123' ---加密導出的主密鑰 --force; ----指定即便當前數據庫主密鑰未打開,或者 SQL Server 沒法對使用該主密鑰加密的某些私鑰進行解密,RESTORE 過程也應繼續執行。 GO ---5.在新服務器上還原證書 USE MASTER GO ---須要先打開數據庫主密鑰 OPEN MASTER KEY DECRYPTION BY PASSWORD = N'MasterKey123' GO CREATE CERTIFICATE MyCerts FROM FILE = 'C:\DECRYPTION\MyCerts' ----證書文件 WITH PRIVATE KEY ( FILE = 'C:\DECRYPTION\MyCertsKey' , ----證書私鑰文件 DECRYPTION BY PASSWORD = 'MyCerts123' ); ----解密私鑰文件 ---6.在新服務器上還原數據庫 USE [master] GO OPEN MASTER KEY DECRYPTION BY PASSWORD = N'MasterKey123' GO RESTORE DATABASE [EncryDb] FROM DISK = N'C:\DECRYPTION\EncryDb.bak' WITH FILE = 1, MOVE N'EncryDb' TO N'C:\DECRYPTION\EncryDb.mdf', MOVE N'EncryDb_log' TO N'C:\DECRYPTION\EncryDb_log.ldf', NOUNLOAD, STATS = 5 GO
注意:在master數據庫中建立數據庫主密鑰和證書。
若是沒有還原數據庫主密鑰和證書直接還原數據庫報錯以下
經過使用證書加密數據庫
步驟操做以下:
USE EncryDb; GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE MyCerts; GO USE EncryDb; GO ---啓用數據庫加密 ALTER DATABASE EncryDb SET ENCRYPTION ON; GO USE EncryDb; GO ---禁用數據庫加密 ALTER DATABASE EncryDb SET ENCRYPTION OFF; GO
1.「透明數據加密」(TDE) 可對數據和日誌文件執行實時 I/O 加密和解密。這種加密使用數據庫加密密鑰 (DEK),該密鑰存儲在數據庫引導記錄中以供恢復時使用。DEK 是使用存儲在服務器的 master 數據庫中的證書保護的對稱密鑰,或者是由 EKM 模塊保護的非對稱密鑰。TDE 保護「處於休眠狀態」的數據,即數據和日誌文件。它提供了聽從許多法律、法規和各個行業創建的準則的能力。軟件開發人員籍此可使用 AES 和 3DES 加密算法來加密數據,且無需更改現有的應用程序。
2.啓用 TDE 時,應該當即備份證書和與證書相關聯的私鑰。若是證書變爲不可用,或者若是必須在另外一臺服務器上還原或附加數據庫,則必須同時具備證書和私鑰的備份,不然將沒法打開該數據庫。即便再也不對數據庫啓用 TDE,也應該保留加密證書或非對稱密鑰。即便數據庫沒有加密,數據庫加密密鑰可能也保留在數據庫中,執行某些操做時可能須要訪問這些加密密鑰。
3.數據庫文件的加密在頁級執行。已加密數據庫中的頁在寫入磁盤以前會進行加密,在讀入內存時會進行解密。TDE 不會增長已加密數據庫的大小。
注意:在master數據庫中建立數據庫主密鑰和證書。
測試在新的數據庫中還原TDE透明加密數據庫
---備份數據庫 USE MASTER GO BACKUP DATABASE [EncryDb] TO DISK = N'C:\DECRYPTION\EncryDb0122.bak' WITH COMPRESSION, stats = 10 ---在新服務器中還原數據庫主密鑰 USE MASTER GO RESTORE MASTER KEY FROM FILE = 'C:\DECRYPTION\MasterKey' DECRYPTION BY PASSWORD = N'MasterKey' ---解密主密鑰文件 ENCRYPTION BY PASSWORD = N'MasterKey123' ---加密導出的主密鑰 --force; ----指定即便當前數據庫主密鑰未打開,或者 SQL Server 沒法對使用該主密鑰加密的某些私鑰進行解密,RESTORE 過程也應繼續執行。 GO ---在新服務器上還原證書 USE MASTER GO ---須要先打開數據庫主密鑰 OPEN MASTER KEY DECRYPTION BY PASSWORD = N'MasterKey123' GO CREATE CERTIFICATE MyCerts FROM FILE = 'C:\DECRYPTION\MyCerts' ----證書文件 WITH PRIVATE KEY ( FILE = 'C:\DECRYPTION\MyCertsKey' , ----證書私鑰文件 DECRYPTION BY PASSWORD = 'MyCerts123' ); ----解密私鑰文件 ---還原備份 USE [master] GO OPEN MASTER KEY DECRYPTION BY PASSWORD = N'MasterKey123' GO RESTORE DATABASE [EncryDb_20180122] FROM DISK = N'C:\DECRYPTION\EncryDb0122.bak' WITH FILE = 1, MOVE N'EncryDb' TO N'C:\DECRYPTION\EncryDb0122.mdf', MOVE N'EncryDb_log' TO N'C:\DECRYPTION\EncryDb0122_log.ldf', NOUNLOAD, STATS = 5 GO
注意:經測試發現只有同數據庫版本能夠還原成功,在搞版本中還原提示會提示錯誤頁,好比2014版本加密的數據庫在2016版本中還原保持以下:
在AS前增長WITH ENCRYPTION加密選項便可
USE EncryDb; GO CREATE PROCEDURE Sptest WITH ENCRYPTION ---加密選項 AS BEGIN END
注意:
1.加密前先保留存儲副本,不然加密完再須要解密就很麻煩
2.加密過的存儲過程不影響修改、刪除,可是沒法查看存儲過程的定義好比:sp_helptext、生成create語句、生成alter語句等。
CREATE DATABASE TestDb GO USE [TestDb] GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MasterKey' GO ---建立證書 CREATE CERTIFICATE MyCerts WITH SUBJECT = 'BackDB Records', EXPIRY_DATE = '10/31/2099'; ----證書過時時間,不指定開始時間默認開始時間爲當前時間 GO ----建立對稱密鑰 CREATE SYMMETRIC KEY SymmetricByCert WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE MyCerts; ----建立測試表 USE TestDb; GO DROP TABLE Test GO CREATE TABLE Test (Id INT NOT NULL, Name NVARCHAR(30) NOT NULL, EncryptionName varbinary(500) null ); GO INSERT INTO Test(Id,Name) VALUES(1,'aa'),(2,'bb'); GO ----加密列 OPEN SYMMETRIC KEY SymmetricByCert DECRYPTION BY CERTIFICATE MyCerts; UPDATE Test SET EncryptionName= EncryptByKey(Key_GUID('SymmetricByCert'), Name); GO SELECT * FROM TEST GO ---解密查詢 OPEN SYMMETRIC KEY SymmetricByCert DECRYPTION BY CERTIFICATE MyCerts; select Id, Name, EncryptionName, convert(nvarchar(30), DecryptByKey(EncryptionName)) ConvertEncryptionName ----nvarchar(30)值和明文字段類型長度保持一致 from test;
注意:
1.加密列的數據類型必須是nvarchar數據類型,不然解密後的結果不會和明文一致。
2.解密過程定義的數據類型須要和明文的數據類型保持一致,包括長度也必須一致。
公鑰和私鑰的解釋參考:http://blog.csdn.net/tanyujing/article/details/17348321
加密參考:https://docs.microsoft.com/zh-cn/sql/relational-databases/security/encryption/encryption-hierarchy
使用對稱密鑰加密數據:https://docs.microsoft.com/zh-cn/sql/t-sql/functions/encryptbykey-transact-sql
備註: 做者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站點全部隨筆都是原創,歡迎你們轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連接,不然保留追究責任的權利。 《歡迎交流討論》 |