適用於:SQL Server
Azure SQL Database
Azure SQL 受控實例
具有安全記憶體保護區的 Always Encrypted 和 Always Encrypted 是專為保護敏感性資訊而設計的功能,包括信用卡號碼和國家或地區標識符(例如美國社會安全號碼),以及 Azure SQL Database、Azure SQL 受控實例和 SQL Server 資料庫。 它可讓用戶端加密用戶端應用程式內的敏感資料,確保加密金鑰絕對不會向資料庫引擎公開。 這樣一來,便可區分擁有資料且可檢視資料的人員,以及管理資料但不應具備存取權的人員:內部部署資料庫管理員、雲端資料庫操作員,或其他未經授權的高特殊權限使用者。 因此,Always Encrypted 可讓客戶在雲端安全儲存敏感資料,並降低惡意內部人員竊取資料的風險。
Always Encrypted 有某些限制,例如無法對加密資料執行多項作業,包括排序、篩選 (除了使用確定性加密的點查閱除外) 等等。這表示某些查詢和應用程式可能與 Always Encrypted 不相容,或可能需要大幅變更應用程式邏輯。
為了解決這些限制, 具有安全記憶體保護區的 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 (不含安全記憶體保護區)隨機加密不支援在加密的數據行上搜尋、分組、編製索引或聯結。 反之,針對用於搜尋或分組用途的資料行,使用具決定性加密是不可或缺的條件。 這允許在加密資料進行點查閱、相等聯結、分組和編製索引。
由於資料庫系統設計無法存取加密資料,因此任何資料行加密都需要移動和加密資料庫外的資料。 這表示此加密流程可能需要很長的時間,而且容易受到網路中斷影響。 此外,如果之後您必須重新加密資料行,例如輪替加密金鑰或變更加密類型時,您會再次遇到相同的難題。 使用 具有安全記憶體保護區的 Always Encrypted, 就不需要將數據移出資料庫。 由於隔離區是受信任的,因此應用程式內的用戶端驅動程式,或是 Azure Data Studio 或 SQL Server Management Studio (SSMS) 等工具,可以在密碼編譯作業期間與隔離區安全共用金鑰。 隔離區接著可以就地加密或重新加密資料行,大幅縮短這些動作所需的時間。
如需 Always Encrypted 密碼編譯演算法的詳細資訊,請參閱 Always Encrypted 密碼編譯。
您可以使用 SQL 工具執行上述步驟:
- 使用 SQL Server Management Studio 布建 Always Encrypted 密鑰
- 使用 PowerShell 設定 Always Encrypted
- sqlpackage - 自動化安裝程式
為確保 Always Encrypted 金鑰和受保護的敏感性資料絕不會以純文字形式向伺服器顯示,資料庫引擎不可涉及佈建金鑰、資料加密或解密等作業。 因此,Transact-SQL (T-SQL) 不支援金鑰佈建或密碼編譯作業。 基於相同原因,現有資料加密或重新加密 (使用不同的加密類型或資料行加密金鑰) 時必須在資料庫外部執行 (SQL 工具可自動化該作業)。
變更加密數據行的定義之後,請執行 sp_refresh_parameter_encryption 以更新 物件的 Always Encrypted 元數據。
限制
下列限制適用於加密資料行的查詢:
使用隨機加密進行加密的資料行不允許執行計算。 確定性加密支援有關相等比較的下列作業 - 不允許其他作業。
注意
對於需要執行模式比對、使用比較運算元、排序和索引加密數據行的應用程式,您應該實作 具有安全記憶體保護區的 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 變數的參數化,以執行處理與加密數據行相關聯值的查詢。 這包括將資料插入加密資料行,或是在資料套用篩選條件等案例 (在使用確定性加密的情況)。
不支援針對加密的欄位的表值參數。
不支援使用下列子句的查詢:
具下列特性的資料行不支援 Always Encrypted:
- 使用下列其中一種數據類型的數據行: xml、 timestamp、 rowversion、 image、 ntext、 text、 sql_variant、 hierarchyid、 geography、 geometry、 vector、alias、user-defined 類型。
- FILESTREAM 欄
- 具有 IDENTITY 屬性的欄位。
- 具有 ROWGUIDCOL 屬性的數據行。
- 字串(varchar、char 等)欄位,使用非 二進位碼點(_BIN2)定序的定序。
- 使用隨機化加密時叢集和非叢集索引的索引鍵資料行 (支援使用確定性加密來編製資料行索引)。
- 包含在全文檢索索引中的欄位(Always Encrypted 不支援 Full-Text 搜尋)。
- 在資料表中指定計算數據列。
- 計算資料行所參考之資料行 (當運算式執行 Always Encrypted 不支援的作業)。
- 使用稀疏欄位。
- 使用隨機加密時, 統計數據 所參考的數據行(支援決定性加密)。
- 分割欄位。
- 具有 預設約束的列。
- 使用隨機加密時,唯一性約束條件所參考的欄位(支持決定性加密)。
- 使用隨機加密時的主索引鍵資料行 (支援決定性加密)。
- 在使用隨機加密或決定性加密時,若參考欄位和被參考欄位使用了不同的密鑰或演算法,則在外鍵約束中引用這些欄位。
- 檢查條件約束所參考的列。
- 使用變更數據擷取來擷取/追蹤的欄位。
- 具有 變更追蹤的數據表之主鍵欄。
- 遮罩的數據行(使用 動態數據遮罩)。
- 在原生編譯模組中參考記憶體優化數據表中的數據行時,加密無法套用至該數據表中的任何數據行。
- 延展資料庫表中的欄位。 (包含使用 [永遠加密] 進行加密之資料行的資料表可針對 Stretch 啟用。)
重要
Stretch Database 在 SQL Server 2022 (16.x) 及 Azure SQL 資料庫中已被取代。 資料庫引擎的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。
- 外部 (PolyBase) 資料表中的資料行 (附註:支援使用外部資料表和包含加密資料行的資料表)。
下列功能無法在加密的資料行運作:
- SQL Server 複寫 (交易式、合併式或快照式複寫)。 支援實體復寫功能,包括 AlwaysOn 可用性群組。
- 分散式查詢(連結的伺服器、 OPENROWSET (Transact-SQL)、 OPENDATASOURCE (Transact-SQL) 。
- 跨資料庫查詢 ,這些查詢會在從不同資料庫加密的數據行上執行聯結。
Always Encrypted Transact-SQL 參考
Always Encrypted 使用下列 Transact-SQL 陳述式、系統目錄檢視、系統預存程序和權限。
陳述式
DDL 語法 | 描述 |
---|---|
建立資料行主密鑰 | 在資料庫建立資料行主要金鑰中繼資料物件 |
DROP COLUMN MASTER KEY(刪除欄位主鍵) | 從資料庫中卸除資料行主要金鑰。 |
建立欄位加密金鑰 | 建立資料行加密金鑰中繼資料物件。 |
ALTER COLUMN 加密金鑰 | 改變資料庫中資料行的加密金鑰,新增或卸除加密的值。 |
刪除列加密金鑰 | 從資料庫中卸除資料行加密金鑰。 |
建立資料表(加密) | 指定加密資料行 |
系統目錄檢視和預存程序
系統目錄檢視和預存程式 | 描述 |
---|---|
sys.column_encryption_keys | 傳回資料行加密金鑰 (CEK) 的相關資訊 |
sys.column_encryption_key_values | 傳回資料行加密金鑰 (CEK) 加密值的相關資訊 |
sys.column_master_keys(欄位主鍵系統) | 傳回每個資料庫主要金鑰的資料列 |
sp_refresh_parameter_encryption | 針對指定的非結構描述繫結預存程序參數、使用者定義函式、檢視、DML 觸發程序、資料庫層級 DDL 觸發程序或伺服器層級 DDL 觸發程序,更新 Always Encrypted 中繼資料 |
sp_describe_parameter_encryption | 分析指定的 Transact-SQL 陳述式及其參數,判斷哪些參數對應至使用 Always Encrypted 功能保護的資料庫資料行。 |
另請參閱 sys.columns ,以取得針對每個數據行儲存之加密元數據的資訊。
資料庫權限
Always Encrypted 有四項資料庫權限。
系統目錄檢視和預存程式 | 描述 |
---|---|
變更任意列主密鑰 | 建立和刪除資料行主要金鑰中繼資料時所需。 |
更改任何列加密金鑰 | 建立和刪除資料行加密金鑰中繼資料時所需。 |
檢視任何資料行主要金鑰定義 | 存取和讀取資料行主要金鑰中繼資料時所需 (查詢加密資料行時需要)。 |
檢視任何數據行加密金鑰定義 | 存取和讀取資料行加密金鑰中繼資料時所需 (查詢加密資料行時需要)。 |
下表摘要說明一般動作所需的權限。
狀況 | 變更任何欄位主鍵 | 變更任何欄位加密金鑰 | 檢視任何欄位主金鑰定義 | 檢視任何數據行加密金鑰定義 |
---|---|---|---|---|
金鑰管理 (在資料庫中建立/變更/檢閱金鑰中繼資料) | 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 許可權預設不會被授予 Public 固定資料庫角色。 這可讓某些現有的舊版工具 (使用舊版 DacFx) 正常運作。 若要使用加密的數據行(即使未解密它們),資料庫管理員必須明確授與 VIEW ANY COLUMN MASTER KEY DEFINITION 和 VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 許可權。