數據加密 第一篇:加密的分層結構
- 2020 年 5 月 17 日
- 筆記
- Security, SQL Server 安全
加密是通過使用密鑰或密碼來混淆數據的處理過程,把明文處理為密文,如果沒有拿到相應的解密密鑰或密碼,即使拿到密文,也是無用,因此加密是保護數據的一個方法。用戶只有拿到密鑰和證書把密文數據解密之後,才能使用數據。如果沒有密鑰和證書,即使得到了數據,也無法得知數據的原始值,數據就沒有價值了。由於數據的加密和解密是一種資源密集性(特別是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)——加密概念