加密是經過使用密鑰或密碼來混淆數據的處理過程,把明文處理爲密文,若是沒有拿到相應的解密密鑰或密碼,即便拿到密文,也是無用,所以加密是保護數據的一個方法。用戶只有拿到密鑰和證書把密文數據解密以後,才能使用數據。若是沒有密鑰和證書,即便獲得了數據,也沒法得知數據的原始值,數據就沒有價值了。因爲數據的加密和解密是一種資源密集性(特別是CPU和I/O )的操做,同時加密後的數據量會增大,所以,每每會帶來查詢性能的降低,通常只會對敏感數據加密。算法
對稱密鑰(Symmetric Keys)sql
雖然是「鑰匙」,可是本質是加密數據的算法,而且是加密中最弱的算法,這是由於使用相同的算法來加密和解密數據。不過即便是最弱的算法,也能增長數據防護的能力,畢竟不是每一個攻擊者都是頂級的。對於對稱密鑰,可使用密碼,或者另外一個密鑰,甚至一個證書來加密。數據庫
非對稱密鑰(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中是高層加密spa
服務主密鑰(Service Master Key,SMK)
服務主密鑰是SQL Server加密層次結構的根。在SQL Server實例安裝後,第一次啓動時自動生成,用於加密數據庫主密鑰(DMK)、憑證(credentials)和連接服務器密碼。經過使用Windows數據保護API(DPAPI)和本地主機的密鑰來加密SMK,DPAPI經過使用從SQL Server服務賬戶的Windows憑據和計算機的憑據派生的密鑰來加密SMK。服務主密鑰只能由建立它的服務賬戶或有權訪問計算機憑據的主體解密。服務主密鑰只能由建立該服務的主Windows服務賬戶或有權訪問該服務賬戶名及其密碼的主體打開。操作系統
每一個SQL實例有且僅有一個服務主密鑰,從SQL 2012開始,使用AES加密算法來保護服務主密鑰(SMK)和數據庫主密鑰(DMK)。
數據庫主密鑰(Database master keys,DMK)
數據庫主密鑰是對稱密鑰,受到服務主密鑰(Service Master Key)或密碼的保護,用於保護證書中的私鑰和數據庫中存在的非對稱密鑰。在數據庫主密鑰建立時,使用AES_256算法和用戶提供的密碼對數據庫主密鑰進行加密。爲了啓用主密鑰的自動解密,可使用服務主密鑰(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' ENCRYPTION BY PASSWORD = 'Pa$$w0rd' ;
2,保護數據庫主密鑰
在mster數據庫中建立數據庫主密鑰,默認使用SMK對DMK進行加密;DMK能夠同時由SMK和密碼進行加密。
CREATE MASTER KEY [ ENCRYPTION BY PASSWORD ='password' ]
當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 = 'Pa$$w0rd'; RESTORE MASTER KEY FROM FILE = 'F:\keys\DB_master_key' DECRYPTION BY PASSWORD = 'Pa$$w0rd'
參考文檔: