SQL Server的加密初探(1)

by adonisy 31. 八月 2020 12:38

簡介 SQL Server資料庫的加密

作 者:楊先民

最近看到一篇文篇,是在講資料加密的一些東西,覺得應該要來好好補充一下資料加密的一些知識,所以就有這文章。

資料加密

加密是使用加密金鑰(簡稱密鑰)和證書(或稱為憑證)的演算法對資料進行混淆的過程,因此,如果繞過安全性並且未經授權的用戶訪問或竊取了數據,那麼它將無法被使用,

除非還獲得了用於加密資料的密鑰。

這在存取的控制之上增加了一層額外的安全性,但是並不能代替對連線控制實現的需求。加密資料還可能會極大地降低性能,因此您應根據需要使用它,而不是將其作為常規

在所有資料上實現。

在本期與下期中,將會示範如何實現透明資料加密(TDE)以及單元級加密,之前討論SQL Server加密層次結構。還將會討論永遠加密和安全的安全區域。

加密層級

SQL Server 提供了通過密鑰和證書的層次結構加密資料的功能。層次結構中的每一層都對其下面那層進行加密。

加密概念

在詳細討論層次結構之前,了解與加密有關的概念很重要。以下各個小段落描述了加密中涉及的主要工件。

對稱金鑰

對稱金鑰是一種可用於加密資料的算法。這是最弱的加密形式,因為它使用相同的演算法來加密和解密資料。它也是具有最小性能開銷的加密方法。

您可以使用密碼或其他密鑰或證書對對稱密鑰進行加密。

非對稱金鑰

與使用相同演算法來加密和解密資料的對稱金鑰相反,非對稱式金鑰使用一對金鑰或算法。您可以將一個僅用於加密,將另一個僅用於解密。

用於加密資料的金鑰稱為私有金鑰,而用於解密資料的金鑰稱為公用金鑰。

證書(憑證)

證書由稱為證書頒發機構(CA)的受信任源頒發。它使用非對稱金鑰,並提供一個數字簽名的聲明,該聲明將公鑰綁定到擁有相應私鑰的主體或設備。

Windows Data Protection API

Windows 資料保護API(DPAPI)是Windows操作系統附帶的加密 API。它允許使用用戶或域機密訊息對金鑰進行加密。 DPAPI用於加密服務主金鑰,這是SQL Server加密層次結構的最頂層。

SQL Server 加密概念

SQL Server 的加密功能依賴於金鑰和證書的層次結構,其根級別為服務主密鑰。以下各部分會介紹主金鑰的使用以及SQL Server的加密層次結構。

Master Key

SQL Server 加密層次結構的根級別是服務主密鑰。構建實例後,將自動創建服務主金鑰,並使用DPAPI加密服務主密鑰,加密資料庫主密鑰,憑證和鏈接服務器的密碼。

服務主金鑰儲存在 Master資料庫中,每台 SQL Server始終只有一個。在SQL Server 2012及更高版本中,服務主金鑰是使用 AES 256的演算法生成的對稱金鑰。

這與使用Triple DES算法的舊版SQL Server形成對比。

由於SQL Server 2012及更高版本中使用了新的加密演算法,因此從SQL Server 2008 R2或更低版本升級新的 SQL Server時,最好重新生成金鑰。

但是,重新生成服務主密鑰的問題在於,它涉及解密然後重新加密層次結構中位於其下方的每個金鑰和證書。

這是一個非常耗費資源的過程,所以應在維護時段內嘗試。你可以使用下列的命令重新生成服務主金鑰。

但是,你應該知道,如果該過程無法解密並重新加密層次結構中位於它下方的任何金鑰,則整個重新生成過程都會失敗。

您可以使用FORCE關鍵字更改此行為。出現錯誤後,FORCE關鍵字會強制該過程繼續。請注意,這將使所有無法解密和重新加密的資料無法使用。您將無法重新使用該資料。

ALTER SERVICE MASTER KEY REGENERATE

由於服務主金鑰非常的重要,因此你必須在創建或重新生成服務主金鑰後對其進行備份,並將其儲存在安全的異地位置,以進行災難恢復。

如果要將 SQL Server遷移到其他服務器,還可以還原此金鑰的備份,以避免加密層次結構出現問題。

下列程式中的腳本演示了如何備份和還原服務主金鑰。如果您還原的主金鑰相同,則SQL Server會通知您,並且不需要重新加密資料。

BACKUP SERVICE MASTER KEY TO FILE = 'c:\keys\service_master_key' ENCRYPTION BY PASSWORD = 'Pa$$w0rd'

RESTORE SERVICE MASTER KEY FROM FILE = 'c:\keys\service_master_key' DECRYPTION BY PASSWORD = 'Pa$$w0rd'

(附註:為了便利起見,那個 service master key不需要附檔名)

與重新生成服務主金鑰時一樣,在還原它時,也可以使用具有相同結果的FORCE關鍵字。資料庫主金鑰是使用 AES 256的演算法加密的對稱金鑰,用於加密儲在資料庫中的私鑰和證書。

它使用密碼進行加密,但是創建的副本使用服務主金鑰進行了加密。這樣可以在需要時自動打開資料庫主密鑰。如果此副本不存在,則需要手動將其打開。

這意味著需要顯式打開金鑰,以便您使用已被金鑰加密的金鑰。資料庫主金鑰的一個副本儲在資料庫中,另一個副本儲在Master資料庫中。

您可以使用下面的命令創建資料庫主金鑰。

CREATE DATABASE Chapter11 MasterKeyExample ; GO

USE Chapter11

MasterKeyExample GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd'

與服務主金鑰一樣,資料庫主金鑰應備份並儲在在安全的異地位置。您可以使用下面的程式備份和還原資料庫主金鑰。

BACKUP MASTER KEY TO FILE = 'c:\keys\Chapter11_master_key' ENCRYPTION BY PASSWORD = 'Pa$$w0rd';

RESTORE MASTER KEY FROM FILE = 'c:\keys\Chapter11_master_key' DECRYPTION BY PASSWORD = 'Pa$$w0rd' 

它將在數資料內加密的密碼。

與服務主金鑰一樣,如果還原無法解密並重新加密層次結構中它下方的任何金鑰,還原將失敗。您可以使用FORCE關鍵字來強制還原成功,

但是這樣做時,您將永久無法使用無法解密和重新加密的金鑰加密的資料。

階層結構

 

SQL Server 的加密階層如下圖:

上圖顯示了服務主金鑰和資料庫主金鑰的副本儲存在 SQL Server級別,並且資料庫主金鑰也儲存在資料庫中。

使用資料庫主金鑰加密的證書,對稱金鑰和非對稱金鑰也儲存在資料庫中。

而在圖的右側,您會看到一個稱為 EKM模組的部分。可擴展金鑰管理(EKM)模組允許你生成和管理用於保護第三方硬體安全模組中的 SQL Server資料的金鑰和證書,這些模組和證書使用Microsoft 加密API(MSCAPI)與SQL Server進行接口。

這是更安全的,因為金鑰沒有和資料一起儲存,但是這也意味著你可以從第三方供應商可能提供的高級功能中受益,例如金鑰旋轉和安全金鑰處理。

在使用第三方EKM模組之前,您需要使用sp_configure在伺服器的層級啟用EKM,並且必須通過將.dll導入 SQL Server來註冊EKM。

許多EKM提供程序都可用,但是下面程式示範如何在安裝資料庫安全包後導入Thales EKM模組。

--Enable EKM sp_configure 'show advanced', 1 GO

RECONFIGURE GO

sp_configure 'EKM provider enabled', 1 GO

RECONFIGURE GO 

CREATE CRYPTOGRAPHIC PROVIDER nCipher_Provider FROM FILE = 'C:\Program Files\nCipher\nfast\bin\ncsqlekm64.dll'

以上就是先介紹一下有關資料加密的一些初級,之後再來看看如何透過這些金鑰來進行一些資料加密的工作。


Tags:

SQL Server資料庫 | 楊先民Adonis Young

不允許評論

NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List