加密是通過使用金鑰或密碼來混淆資料的處理過程,把明文處理為密文,如果沒有拿到相應的解密金鑰或密碼,即使拿到密文,也是無用,因此加密是保護資料的一個方法。使用者只有拿到金鑰和證照把密文資料解密之後,才能使用資料。如果沒有金鑰和證照,即使得到了資料,也無法得知資料的原始值,資料就沒有價值了。由於資料的加密和解密是一種資源密集性(特別是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中是高層加密
二,SQL Server加密概念
服務主金鑰(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'
參考文件:
SQL Server and Database Encryption Keys (Database Engine)
SQL Server 安全篇——SQL Server加密(1)——加密概念