一、概述 加密是一種安全措施,有時候甚至是法律要求。作為攻破Windows系統的最後一道防線,通過加密可以保證在沒有密鑰的情況下獲取備份或者物理介質變得毫無意義。 二、概念 加密層次結構 加密層次結構的每一層是如何對它下麵的一層進行加密的,並且顯示了最常用的加密配置。對層次結構的開始進行的訪問通常受 ...
一、概述
加密是一種安全措施,有時候甚至是法律要求。作為攻破Windows系統的最後一道防線,通過加密可以保證在沒有密鑰的情況下獲取備份或者物理介質變得毫無意義。
二、概念
加密層次結構
加密層次結構的每一層是如何對它下麵的一層進行加密的,並且顯示了最常用的加密配置。對層次結構的開始進行的訪問通常受密碼保護。SQL Server 用分層加密和密鑰管理基礎結構來加密數據。每一層都使用證書、非對稱密鑰和對稱密鑰的組合對它下麵的一層進行加密。非對稱密鑰和對稱密鑰可以存儲在 SQL Server 之外的可擴展密鑰管理 (EKM) 模塊中。
註意:
-
為了獲得最佳性能,使用對稱密鑰(而不是證書或非對稱密鑰)加密數據。
-
資料庫主密鑰受服務主密鑰保護。 服務主密鑰由 SQL Server 安裝程式創建,並且使用 Windows 數據保護 API (DPAPI) 進行加密。
-
堆疊其他層的其他加密層次結構是可能的。
-
可擴展密鑰管理 (EKM) 模塊將對稱密鑰或非對稱密鑰保存在 SQL Server 的外部。
-
透明數據加密 (TDE) 必須使用稱為資料庫加密密鑰的對稱密鑰,該密鑰受由 master 資料庫的資料庫主密鑰保護的證書保護,或者受存儲在 EKM 中的非對稱密鑰保護。
-
服務主密鑰和所有資料庫主密鑰是對稱密鑰。
1.服務主密鑰(Service Master Key)
每一個實例只有一個服務主密鑰,服務主密鑰用於加密資料庫主密鑰,服務主密鑰為 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 將對所有已使用當前服務主密鑰加密的密鑰和機密內容進行解密,然後使用從備份文件中載入的服務主密鑰對這些密鑰和機密內容進行加密。
2.資料庫主密鑰
資料庫主密鑰創建於對應資料庫下,具體的保護對象可以參考下麵的資料庫範圍的安全對象。如果要對資料庫備份或者透明資料庫加密那麼需要將服務主密鑰創建於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進行解密。
3.證書
證書使用公鑰對安全對象進行加密,使用私鑰進行解密,預設證書存在就自動解密。
----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 選項。
只有在使用密碼對私鑰進行加密時,才使用該選項。
如果未指定密碼,則使用資料庫主密鑰對證書的私鑰進行加密。 如果資料庫主密鑰無法打開,則省略該子句會導致錯誤。
4.非對稱密鑰
“非對稱密鑰”是資料庫級的安全對象實體。該實體的預設格式包含公鑰和私鑰。當未使用 FROM 子句執行時,CREATE ASYMMETRIC KEY 會生成新的密鑰對。當使用 FROM 子句執行時,CREATE ASYMMETRIC KEY 會從文件中導入密鑰對,或從程式集中導入公鑰。
預設情況下,私鑰受資料庫主密鑰保護。如果尚未創建任何資料庫主密鑰,則需要使用密碼保護私鑰。如果不存在資料庫主密鑰,則可以選擇性地使用密碼。
通常使用RSA加密演算法,RSA_512、RSA_1024、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
5.對稱密鑰
創建對稱密鑰時,必須至少使用以下項之一來對該對稱密鑰進行加密:證書、密碼、對稱密鑰、非對稱密鑰或 PROVIDER。可使用上述每種類型中的多項對密鑰進行加密。換言之,可以同時使用多個證書、密碼、對稱密鑰以及非對稱密鑰對單個對稱密鑰進行加密
通常使用AES演算法,有AES_128、AES_192、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.安全對象範圍:伺服器
包含以下安全對象:
- 端點
- 登錄帳戶
- 資料庫
2.安全對象範圍:資料庫
包含以下安全對象:
- 用戶
- 角色
- 應用程式角色
- 程式集
- 消息類型
- 路由
- 服務
- 遠程服務綁定
- 全文目錄
- 證書
- 非對稱密鑰
- 對稱密鑰
- 約定
- 架構
3.安全對象範圍:架構
包含以下安全對象:
- 類型
- XML 架構集合
- 對象
對象
下麵是對象類的成員:
-
- 聚合
- 約束
- 函數
- 過程
- 隊列
- 統計信息
- 同義詞
- 表
- 視圖
- 聚合
四、案例
案例1.備份加密
通過使用證書加密備份,如果需要在新的伺服器上還原備份,先還原資料庫主密鑰和證書,然後就可以自動解密還原備份。
--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資料庫中創建資料庫主密鑰和證書。
如果沒有還原資料庫主密鑰和證書直接還原資料庫報錯如下
案例2.TDE透明資料庫加密
通過使用證書加密資料庫
步驟操作如下:
- 創建主密鑰
- 創建或獲取由主密鑰保護的證書
- 創建資料庫加密密鑰並通過此證書保護該密鑰
- 將資料庫設置為使用加密
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版本中還原保持如下:
案例3.存儲過程加密
在AS前增加WITH ENCRYPTION加密選項即可
USE EncryDb; GO CREATE PROCEDURE Sptest WITH ENCRYPTION ---加密選項 AS BEGIN END
註意:
1.加密前先保留存儲副本,否則加密完再需要解密就很麻煩
2.加密過的存儲過程不影響修改、刪除,但是無法查看存儲過程的定義比如:sp_helptext、生成create語句、生成alter語句等。
案例4.數據列加密
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 本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。 《歡迎交流討論》 |