Always Encrypted
適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Always Encrypted 功能旨在保護 Azure SQL 資料庫、Azure SQL 受控執行個體和 SQL Server 資料庫中儲存的敏感性資料,例如信用卡號碼或國家/地區識別碼 (例如美國社會安全號碼)。 Always Encrypted 可讓用戶端將用戶端應用程式內的敏感性資料加密,絕不向資料庫引擎透露加密金鑰。 如此便可區分擁有資料且可檢視資料的人員,以及管理資料但不應具備存取權的人員:內部部署資料庫管理員、雲端資料庫操作員,或其他未經授權的高權限使用者等。 因此,Always Encrypted 可讓客戶安心在雲端儲存敏感性資料,並降低惡意內部人員竊取資料的可能性。
Always Encrypted 可設定支援有限的加密資料機密查詢,以及相等比較的相關查詢。 例如,點式查閱搜尋或相等聯結。 這類查詢會使用確定性加密。
注意
安全記憶體保護區會利用模式比對、其他比較運算子和就地加密,以擴充 Always Encrypted 的機密計算功能。 如需詳細資訊,請參閱具有安全記憶體保護區的 Always Encrypted。
永遠加密讓應用程式加密變得透明化。 安裝在用戶端電腦上且啟用永遠加密的驅動程式,透過自動將用戶端應用程式中的機密資料進行加密與解密,進而達成此目的。 驅動程式會加密敏感性資料行中的資料,再將該資料傳遞至資料庫引擎,並自動重寫查詢以將語意保存到應用程式。 同樣地,驅動程式會將儲存在加密資料庫資料行並包含在查詢結果中的資料明確解密。
設定 Always Encrypted
本節提供設定 Always Encrypted 的概觀。 如需詳細資訊和入門相關資訊,請參閱教學課程:開始使用 Always Encrypted。
若要在資料庫中設定 Always Encrypted,您必須:
佈建密碼編譯金鑰以保護您的資料。 Always Encrypted 使用兩種金鑰類型:
- 資料行加密金鑰。
- 資料行主要金鑰。
資料行加密金鑰用來將加密資料行中的資料加密。 資料行主要金鑰是金鑰保護金鑰,可加密一或多個資料行加密。
您必須將資料行主要金鑰儲存在資料庫系統外部受信任的金鑰存放區,例如 Azure Key Vault、Windows 憑證存放區或硬體安全模組。
接著,您必須佈建資料行加密金鑰,並使用資料行主要金鑰來加密每個金鑰。
最後,您必須將金鑰的相關中繼資料儲存在資料庫內。
- 資料行主要金鑰中繼資料會擷取資料行主要金鑰的位置。
- 資料行加密金鑰中繼資料包含資料行加密金鑰的加密值。 資料庫引擎絕不會以任何純文字類型的方式儲存或使用金鑰。
如需 Always Encrypted 金鑰的相關資訊,請參閱 Always Encrypted 金鑰管理概觀
針對所選資料庫的資料行設定加密,以保護其中的敏感性資料。 這可能需要建立具有加密資料行的新資料表,或者加密現有的資料庫資料行及現有資料。 設定資料行加密時,您可指定加密演算法的相關資訊和資料行加密金鑰,以保護資料行中的資料及加密類型。 Always Encrypted 支援兩個加密類型:
確定性加密一律會針對特定的純文字值產生相同的加密值。 使用確定性加密時,您能根據加密資料行進行點查閱、相等聯結、分組和編製索引等作業。 但它也可能讓未獲授權使用者檢查加密資料行中的模式,來猜出加密值資訊,尤其當其中有一小組可能的加密值時 (例如 True/False 或北/南/東/西區域)。
隨機加密 使用的方法會以更難預測的方式來加密資料。 隨機化加密雖較安全,但會讓您無法針對加密資料行進行搜尋、分組、編製索引和聯結等作業。
針對將做為搜尋或分組參數的資料行,請使用決定性加密。 例如,政府識別碼數字。 針對未利用其他記錄且未用來聯結資料表的資料 (例如機密調查註解),請使用隨機加密。
如需 Always Encrypted 密碼編譯演算法的詳細資訊,請參閱 Always Encrypted 密碼編譯。
您可使用 SQL 工具執行上述步驟:
為確保 Always Encrypted 金鑰和受保護的敏感性資料絕不會以純文字形式向伺服器顯示,資料庫引擎不可涉及佈建金鑰、資料加密或解密等作業。 因此,Transact-SQL (T-SQL) 不支援金鑰佈建或密碼編譯作業。 基於相同原因,現有資料加密或重新加密 (使用不同的加密類型或資料行加密金鑰) 時必須在資料庫外部執行 (SQL 工具可自動化該作業)。
注意
使用安全記憶體保護區的 Always Encrypted 允許使用 T-SQL 進行現有資料的密碼編譯作業,且無須將資料移至資料庫外部,因此可免於上述部分限制。
加密資料行的查詢方式
若要在加密的資料庫資料行上執行查詢、將資料插入加密資料行、從加密資料行擷取純文字值,或使用確定性加密執行資料行的支援作業 (例如點式查閱搜尋),使用者或發出查詢的應用程式必須符合下列必要條件:
- 可存取保護資料的資料行主要金鑰。 除了資料庫層級權限以外,也需要金鑰存取權,例如資料表 (包含資料) 中的
SELECT
。 - 連線至資料庫,且資料庫連線啟用 Always Encrypted。 大部分的 SQL 工具和 SQL 用戶端驅動程式皆支援資料庫連線啟用 Always Encrypted。
注意
若使用者具備讀取資料所需的資料庫權限,但無法存取保護資料的金鑰,使用者仍可連線至資料庫並擷取加密文字資料,而無須在資料庫連線中啟用 Always Encrypted。
以下是加密資料行的查詢運作方式:
- 當應用程式發出參數化查詢時,應用程式內的 SQL 用戶端驅動程式以透明方式聯繫資料庫引擎 (呼叫sp_describe_parameter_encryption (Transact-SQL),以便確定哪些參數以加密資料行為目標且應加密。 針對每個需要加密的參數,驅動程式會收到加密演算法、加密類型和金鑰中繼資料,包含加密的資料行加密金鑰及其對應資料行主要金鑰的位置。
- 驅動程式會呼叫金鑰存放區,其中包含資料行主要金鑰,以便解密加密資料行的加密金鑰值。 系統會快取產生的純文字資料行加密金鑰,以減少後續使用相同資料行加密金鑰的金鑰存放區來回行程。
- 驅動程式會使用取得的純文字資料行加密金鑰,以加密對應至加密資料行的查詢參數。
- 針對目標為加密資料行的參數,驅動程式會以加密值取代該參數的純文字值,並將查詢傳送至伺服器進行處理。
- 資料庫引擎會執行查詢,這可能會對使用確定性加密的資料行進行相等比較。
- 若查詢結果包含加密資料行的資料,資料庫引擎便會將各資料行的加密中繼資料 (包含加密演算法、加密類型和金鑰中繼資料的相關資訊) 附加至結果集。
- 資料庫引擎會將結果集傳送至用戶端應用程式。
- 針對所接收結果集中的各個加密資料行,驅動程式會先嘗試在本機快取中尋找純文字資料行加密金鑰;若在快取中找不到金鑰,只會在存放資料行主要金鑰的金鑰存放區中進行一次來回行程。
- 驅動程式會解密結果,並將純文字值傳回給應用程式。
用戶端驅動程式會使用資料行主要金鑰存放區提供者與包含資料行主要金鑰的金鑰存放區互動,後者是用戶端軟體元件,其中封裝包含資料行主要金鑰的金鑰存放區。 Microsoft 的用戶端驅動程式程式庫可使用常見類型的金鑰存放區提供者,或可作為獨立下載項目。 您也可以實作自己的提供者。 Always Encrypted 功能 (包括內建的資料行主要金鑰存放區提供者) 會因驅動程式庫及其版本而異。
如如需支援 Always Encrypted 的用戶端驅動程式清單,請參閱使用 Always Encrypted 開發應用程式,以取得有關查詢加密資料行的應用程式開發相關資訊。
您也可使用 SQL 工具查詢加密的資料行,例如 Azure Data Studio 或 SSMS。
限制
下列限制適用於加密資料行的查詢:
確定性加密支援有關相等比較的下列作業 - 不允許其他作業。
- 點式查閱搜尋中的 = (等號)。
- IN。
- SELECT - GROUP BY。
- DISTINCT。
使用隨機加密進行加密的資料行不允許執行計算。
注意
具有安全記憶體保護區的 Always Encrypted 可使用模式比對、比較運算子、排序,並使用隨機加密來編製資料行索引,有助因應上述限制。
若查詢陳述式會同時觸發純文字和加密資料相關計算,則不允許使用。 例如:
- 比較加密資料行與純文字資料行或常值。
- 將純文字資料行的資料複製至加密資料行 (或反向) UPDATE、BULK INSERT、SELECT INTO 或 INSERT..SELECT。
- 將常值插入加密的資料行。
這類陳述式會導致運算元衝突錯誤,如下所示:
Msg 206, Level 16, State 2, Line 89 Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char
應用程式必須使用查詢參數來傳遞對應至加密資料行的值。 例如將資料插入加密資料行,或 (使用確定性加密) 篩選加密資料行時。 不支援傳遞對應至加密資料行的常值或 T-SQL 變數。 如需有關目前使用的用戶端驅動程式詳細資訊,請參閱使用 Always Encrypted 開發應用程式。
您必須使用 Azure Data Studio 或 SSMS 中的 Always Encrypted 參數化變數,以便發出查詢,傳遞這些工具中加密資料行的對應值。 例如將資料插入加密資料行,或 (使用確定性加密) 篩選加密資料行時。
不支援目標為加密資料行的資料表值參數。
不支援使用下列子句的查詢:
變更加密資料行的定義後,執行 sp_refresh_parameter_encryption 以更新該物件的 Always Encrypted 中繼資料。
具下列特性的資料行不支援 Always Encrypted:
- 使用下列其中一個資料類型的資料行:xml、timestamp、rowversion、image、ntext、text、sql_variant、hierarchyid、geography、geometry、alias、使用者定義類型。
- FILESTREAM 資料行
- 屬性為 IDENTITY 的資料行。
- 屬性為 ROWGUIDCOL 的資料行。
- 字串 (varchar、char 等) 資料行,使用確定性加密時具有二進位字碼指標 (_BIN2) 定序以外的定序。
- 使用隨機化加密時叢集和非叢集索引的索引鍵資料行 (支援使用確定性加密來編製資料行索引)。
- 全文檢索索引所包含的資料行 (Always Encrypted 不支援全文檢索搜尋)。
- 計算資料行。
- 計算資料行所參考之資料行 (當運算式執行 Always Encrypted 不支援的作業)。
- 疏鬆資料行集合。
- 使用隨機化加密時,統計資料所參考的資料行 (支援確定性加密)。
- 資料分割資料行。
- 包含預設條件約束的資料行。
- 使用隨機加密時,唯一條件約束所參考的資料行 (支援確定性加密)。
- 使用隨機加密時的主索引鍵資料行 (支援決定性加密)。
- 使用隨機加密或使用確定性加密時 (若已參考及參考資料行使用不同的索引鍵或演算法),外部索引鍵條件約束中的參考資料行。
- 檢查條件約束所參考的資料行。
- 使用異動資料擷取來擷取/追蹤的資料行。
- 具有變更追蹤的資料表上的主索引鍵資料行。
- 已遮罩的資料行 (使用動態資料遮罩)。
- Stretch Database 資料表中的資料行。 (包含使用 [永遠加密] 進行加密之資料行的資料表可針對 Stretch 啟用。)
重要
Stretch Database 在 SQL Server 2022 (16.x) 及 Azure SQL 資料庫中已被取代。 資料庫引擎的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。
- 外部 (PolyBase) 資料表中的資料行 (附註:支援使用外部資料表和包含加密資料行的資料表)。
下列功能無法在加密的資料行運作:
- SQL Server 複寫 (交易式、合併式或快照式複寫) 。 支援實體複寫功能,包含 Always。
- 分散式查詢 (連結伺服器、OPENROWSET(Transact-SQL)、OPENDATASOURCE(Transact-SQL))。
- 跨資料庫查詢,針對不同資料庫的資料行執行聯結 (使用確定性加密)。
Always Encrypted Transact-SQL 參考
Always Encrypted 使用下列 Transact-SQL 陳述式、系統目錄檢視、系統預存程式和權限。
陳述式
- CREATE COLUMN MASTER KEY (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- CREATE COLUMN ENCRYPTION KEY (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- DROP COLUMN ENCRYPTION KEY (Transact-SQL)
- CREATE TABLE (ENCRYPTED WITH)
系統目錄檢視和預存程序
- sys.column_encryption_keys (Transact-SQL)
- sys.column_encryption_key_values (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sp_refresh_parameter_encryption (Transact-SQL)
- sp_describe_parameter_encryption (Transact-SQL)
如需各資料行所儲存的加密中繼資料相關資訊,另請參閱 sys.columns (Transact-SQL)。
資料庫權限
Always Encrypted 的四項資料庫權限如下:
ALTER ANY COLUMN MASTER KEY - 建立和刪除資料行主要金鑰中繼資料時所需。
ALTER ANY COLUMN ENCRYPTION KEY - 建立和刪除資料行加密金鑰中繼資料時所需。
VIEW ANY COLUMN MASTER KEY DEFINITION - 存取和讀取資料行主要金鑰中繼資料時所需 (查詢加密資料行時需要)。
VIEW ANY COLUMN ENCRYPTION KEY DEFINITION - 存取和讀取資料行主要金鑰中繼資料時所需 (查詢加密資料行時需要)。
下表摘要說明一般動作所需的權限。
狀況 | ALTER ANY COLUMN MASTER KEY | ALTER ANY COLUMN ENCRYPTION KEY | VIEW ANY COLUMN MASTER KEY DEFINITION | VIEW ANY COLUMN ENCRYPTION KEY DEFINITION |
---|---|---|---|---|
金鑰管理 (在資料庫中建立/變更/檢閱金鑰中繼資料) | X | X | X | X |
查詢加密資料行 | X | X |
重要考量
即使使用者沒有資料行主要金鑰的權限 (在其金鑰存放區內),選取加密資料行時仍需要 VIEW ANY COLUMN MASTER KEY DEFINITION 和 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限,以保護資料行,且無法存取純文字嘗試。
在 SQL Server 中,VIEW ANY COLUMN MASTER KEY DEFINITION 和 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限預設皆會授與公用固定資料庫角色。 資料庫管理員可選擇撤銷 (或拒絕) 授與給公用角色的權限,而是將這些權限授與給特定角色或使用者,以實作更嚴格的控制。
在 SQL Database 中,VIEW ANY COLUMN MASTER KEY DEFINITION 和 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限預設不會授與公用固定資料庫角色。 這可讓某些現有的舊版工具 (使用舊版 DacFx) 正常運作。 若要使用加密資料行 (即使未進行解密),資料庫管理員必須明確授與 VIEW ANY COLUMN MASTER KEY DEFINITION 和 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限。