加密是通過使用密鑰或密碼來混淆數據的處理過程,把明文處理為密文,如果沒有拿到相應的解密密鑰或密碼,即使拿到密文,也是無用,因此加密是保護數據的一個方法。用戶只有拿到密鑰和證書把密文數據解密之后,才能使用數據。如果沒有密鑰和證書,即使得到了數據,也無法得知數據的原始值,數據就沒有價值了。由於數據的加密和解密是一種資源密集性(特別是CPU和I/O )的操作,同時加密后的數據量會增大,因此,往往會帶來查詢性能的下降,一般只會對敏感數據加密。
一,加密概念
對稱密鑰(Symmetric Keys)
雖然是“鑰匙”,但是本質是加密數據的算法,並且是加密中最弱的算法,這是因為使用相同的算法來加密和解密數據。不過即使是最弱的算法,也能增加數據防御的能力,畢竟不是每個攻擊者都是頂級的。對於對稱密鑰,可以使用密碼,或者另一個密鑰,甚至一個證書來加密。
非對稱密鑰(Asymmetric Keys)
跟對稱密鑰相對,它使用一對密鑰(算法),一個密鑰用於加密,另一個密鑰用於解密,加密的密鑰稱為私鑰(private key),解密的密鑰稱為公鑰(public key)。跟對稱密鑰相比,非對稱密鑰提供的安全級別更高,也更消耗資源。
證書(Certificates)
公鑰證書(Public Key Certificate)簡稱為證書,由受信任的源 (稱為證書頒發機構 (CA)) 頒發。證書是一種數字簽名的語句,使用的是非對稱密鑰,它將公鑰的值綁定到擁有相應私鑰的個人,設備或服務的ID上。證書由證書頒發機構(CA)頒發和簽名。從CA接收證書的實體是該證書的主題(Subject),證書通常包含以下信息:
- 主題的公鑰
- 主題的標識符信息
- 證書的有效期,證書僅在其中指定的時間段內有效
- 證書發行者的標識信息
- 發行人的數字簽名
Windows 數據保護API(DPAPI,Windows Data Protection API)
是與 Windows 操作系統一起運行的加密應用程序編程接口 (API),可以使用用戶安全信息或者域安全信息來加密密鑰。DPAPI用於加密服務主密鑰(service master key),服務主密鑰在SQL Server中是高層加密
對於證書,對稱密鑰和非對稱密鑰:
- Service master key 和database master key 都是一種Symmetric key,
- 在正常的情況下,對於證書、對稱性密鑰、非對稱性密鑰,每次生成的都不一樣,即使命令相同。
- 對於非對稱性密鑰,密鑰不可以備份或復制,一旦創建,公鑰和私鑰永遠一樣。
- 對於證書,可以導出證書的副本,方便對證書進行還原。
二,SQL Server加密概念
服務主密鑰(Service Master Key,SMK)
服務主密鑰是SQL Server加密層次結構的根。在安裝SQL Server實例后,第一次啟動SQL Server會自動生成SMK,用於加密數據庫主密鑰(DMK)、憑證(credentials)和鏈接服務器的密碼。SQL Server通過使用Windows數據保護API(DPAPI)或本地主機的密鑰來加密SMK,DPAPI通過使用從SQL Server服務帳戶的Windows憑據和計算機的憑據派生的密鑰來加密SMK,這意味着,加密SMK的密鑰只跟SQL Server實例所在的主機有關。
如果要修改SQL Server服務的賬戶,請使用SQL Server配置管理器。為了實現服務帳戶的更改,SQL Server存儲受計算機帳戶保護的服務主密鑰的冗余副本,該計算機賬戶被授予訪問SQL Server服務組的必要權限。如果重建計算機,則以前由服務帳戶使用的相同域用戶(Domain User)可以恢復服務主密鑰。除了域用戶之外,本地帳戶或Local System, Local Service, 或 Network Service帳戶不能用於回復SMK。如果需要把SQL Server轉移到另一台計算機,請使用備份和還原遷移服務主密鑰。
從SQL Server 2012開始,使用AES算法來加密SMK和DMK。服務主密鑰只能由創建它的服務帳戶或有權訪問計算機憑據的主體解密。服務主密鑰只能由創建該服務的主Windows服務帳戶或有權訪問該服務帳戶名及其密碼的主體打開。每個SQL實例有且僅有一個服務主密鑰,從SQL 2012開始,使用AES加密算法來保護服務主密鑰(SMK)和數據庫主密鑰(DMK)。
ALTER SERVICE MASTER KEY [ FORCE ] REGENERATE
REGENERATE短語用於重新生成服務主密鑰,當重新生成服務主密鑰后,SQL Server解密使用它加密的所有密鑰,然后使用新的服務主密鑰對它們進行加密。這是一項資源密集型操作,除非密鑰已被盜用,否則您應該在需求低的時期內安排此操作。如果任何解密失敗,則整個語句都會失敗。
當無法檢索當前的主密鑰,或者無法使用SMK解密私鑰時,考慮使用FORCE選項,它強制密鑰重新生成。注意,僅當REGENERATE失敗並且無法使用RESTORE SERVICE MASTER KEY語句還原服務主密鑰時,才使用FORCE選項。
數據庫主密鑰(Database master keys,DMK)
數據庫主密鑰是對稱密鑰,受到服務主密鑰(Service Master Key)或密碼的保護,用於保護證書和非對稱密鑰的私鑰。DMK也可以加密數據,但是有長度的限制,與對稱密鑰相比,它對數據的實用性較差。
在數據庫主密鑰創建時,使用AES_256算法,用戶提供的密碼或SMK對數據庫主密鑰進行加密。為了數據庫啟用主密鑰的自動解密,可以使用服務主密鑰(SMK)對數據庫主密鑰的副本進行加密,並將其存儲在數據庫和master數據庫中。默認情況下,每當更改主密鑰時,存儲在master數據庫中的副本都會以靜默方式進行更新。master數據庫中的sys.databases目錄視圖的is_master_key_encrypted_by_server列指示數據庫主密鑰是否已由服務主密鑰加密。
默認情況下,使用SMK對DMK進行加密,也可以修改該默認設置:
ALTER MASTER KEY ADD ENCRYPTION BY { SERVICE MASTER KEY | PASSWORD = 'password' } | DROP ENCRYPTION BY { SERVICE MASTER KEY | PASSWORD = 'password' }
當使用ADD ENCRYPTION BY SERVICE MASTER KEY 選項時,使用服務主密鑰對DMK進行加密,並把主密鑰存儲到當前數據庫和master數據庫中。 DROP ENCRYPTION BY SERVICE MASTER KEY選項用於移除通過SMK對DMK的加密,此時應該使用密碼對DMK進行加密。
如果使用密碼對DMK進行加密,必須使用OPEN MASTER KEY語句和密碼來打開未由服務主密鑰加密的主密鑰。
三,加密的分層結構
SQL Server使用分層加密和密鑰管理基礎結構來加密數據,每一層通過使用證書(Certificate),非對稱密鑰(Asymmetric Key)和對稱密鑰(Symmetric Key)的組合來加密其下面的層。可以把非對稱密鑰和對稱密鑰存儲在SQL Server外部的可擴展密鑰管理(Extensible Key Management,EKM)模塊中。
下圖顯示了加密層次結構的每一層都對其下面的層進行了加密,並顯示了最常見的加密配置。通常使用密碼來保護對層次結構起點的訪問:
在上圖中,PW是指密碼(PassWord),可擴展密鑰管理(EKM)模塊在SQL Server外部保存對稱或非對稱密鑰。
從加密性能上來看,對稱加密的性能最好,優於證書和非對稱加密。
四,保護主密鑰
應該在創建服務主密鑰或數據庫主密鑰時,盡快備份主密鑰,把主密鑰保存在安全的異地位置上。
如果數據庫主密鑰使用SMK加密,那么在備份時不需要顯式打開;如果數據庫主密鑰使用密碼加密,在備份數據庫主密鑰之前,必須用密碼打開,在數據庫主密鑰解密之后,才能備份。
1,備份和還原服務主密鑰
對服務主密鑰進行備份,需要使用密碼對備份文件進行加密;在還原服務主密鑰時,使用密碼來解密備份文件。
BACKUP SERVICE MASTER KEY TO FILE = 'F:\keys\service_master_key' ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ; RESTORE SERVICE MASTER KEY FROM FILE = 'F:\keys\service_master_key' DECRYPTION BY PASSWORD = 'Pa$$w0rd' ;
2,創建數據庫主密鑰
在mster數據庫中創建數據庫主密鑰,默認使用SMK對DMK進行加密,推薦使用默認的加密方式。
CREATE MASTER KEY [ ENCRYPTION BY PASSWORD ='password' ]
當使用ENCRYPTION BY PASSWORD ='password' 選項時,使用密碼對DMK進行加密;當省略該選項時,使用SMK對DMK進行加密。
3,備份和還原DMK
當DMK使用SMK進行加密時,它會在需要時自動打開;如果DMK使用密碼進行加密,那么在使用時必須顯式打開:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
打開DMK之后,完成操作(備份、還原、加密和解密)之后,要關閉DMK。在當前會話中,OPEN和CLOSE必須是成對出現的。
CLOSE MASTER KEY
例子:如果數據庫主密鑰使用密碼加密,在備份數據庫主密鑰之前,必須用密碼打開,在數據庫主密鑰解密之后,才能備份。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ; OPEN MASTER KEY DECRYPTION BY PASSWORD = 'Pa$$w0rd'; BACKUP MASTER KEY TO FILE = 'F:\keys\DB_master_key' ENCRYPTION BY PASSWORD = 'back_Pwd'; RESTORE MASTER KEY FROM FILE = 'F:\keys\DB_master_key' DECRYPTION BY PASSWORD = 'back_Pwd'
參考文檔:
SQL Server and Database Encryption Keys (Database Engine)
SQL Server and Database Encryption Keys (Database Engine)
SQL Server 安全篇——SQL Server加密(1)——加密概念