共用方式為


Always Encrypted

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體

Always Encrypted 圖表。

Always Encrypted 和具有安全隔離區的 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 的概觀。 如需詳細資訊和入門相關資訊,請參閱教學課程:開始使用 Always Encrypted

若要在資料庫設定 Always Encrypted,請遵循下列步驟:

  1. 佈建密碼編譯金鑰以保護您的資料。 Always Encrypted 使用兩種金鑰類型:

    • 資料行加密金鑰。
    • 資料行主要金鑰。

    資料行加密金鑰用於將加密資料行中的資料加密。 資料行主要金鑰是金鑰保護金鑰,可加密一或多個資料行加密。

    您必須將資料行主要金鑰儲存在資料庫系統外部受信任的金鑰存放區,例如 Azure Key VaultWindows 憑證存放區或硬體安全模組。 接著,您必須佈建資料行加密金鑰,並使用資料行主要金鑰加密每個金鑰。

    最後,將金鑰的相關中繼資料儲存在資料庫。 資料行主要金鑰中繼資料包含資料行主要金鑰的位置。 資料行加密金鑰中繼資料包含資料行加密金鑰的加密值。 資料庫引擎不會以純文字儲存或使用任何索引鍵。

    如需管理 Always Encrypted 金鑰的相關資訊,請參閱 Always Encrypted 金鑰管理概觀

  2. 為包含敏感資訊的特定資料庫資料行設定加密,以確保安全無虞。 這可能需要建立具有加密資料行的新資料表,或者加密現有的資料行與資料。 設定資料行加密時,您必須指定加密演算法的相關資訊、資料行加密金鑰,以保護資料與加密類型。 Always Encrypted 支援兩個加密類型:

    • 確定性加密一律會針對特定的純文字值產生相同的加密值。 使用確定性加密時,您能根據加密資料行進行點查閱、等值連接、分組和編製索引等作業。 但它也可能讓未獲授權使用者檢查加密資料行中的模式,來猜出加密值資訊,尤其當其中有一小組可能的加密值時 (例如 True/False 或北/南/東/西區域)。

    • 隨機加密使用以無法預測方式加密資料的方法。 每個相同的純文字輸入,都會產生不同的加密輸出。 這可改善隨機化加密的安全性。

若要執行模式比對、使用比較運算子、排序和索引加密資料行,您應該採用具有安全隔離區的 Always Encrypted,並且套用隨機加密。 Always Encrypted (不含安全隔離區) 隨機加密不支援在加密資料行搜尋、分組、編製索引或聯結。 反之,針對用於搜尋或分組用途的資料行,使用具決定性加密是不可或缺的條件。 這允許在加密資料進行點查閱、相等聯結、分組和編製索引。

由於資料庫系統設計無法存取加密資料,因此任何資料行加密都需要移動和加密資料庫外的資料。 這表示此加密流程可能需要很長的時間,而且容易受到網路中斷影響。 此外,如果之後您必須重新加密資料行,例如輪替加密金鑰或變更加密類型時,您會再次遇到相同的難題。 使用具有安全隔離區的 Always Encrypted,就不需要將資料移出資料庫。 由於隔離區是受信任的,因此應用程式內的用戶端驅動程式,或是 Azure Data Studio 或 SQL Server Management Studio (SSMS) 等工具,可以在密碼編譯作業期間與隔離區安全共用金鑰。 隔離區接著可以就地加密或重新加密資料行,大幅縮短這些動作所需的時間。

如需 Always Encrypted 密碼編譯演算法的詳細資訊,請參閱 Always Encrypted 密碼編譯

您可使用 SQL 工具執行上述步驟:

為確保 Always Encrypted 金鑰和受保護的敏感性資料絕不會以純文字形式向伺服器顯示,資料庫引擎不可涉及佈建金鑰、資料加密或解密等作業。 因此,Transact-SQL (T-SQL) 不支援金鑰佈建或密碼編譯作業。 基於相同原因,現有資料加密或重新加密 (使用不同的加密類型或資料行加密金鑰) 時必須在資料庫外部執行 (SQL 工具可自動化該作業)。

變更加密資料行的定義後,執行 sp_refresh_parameter_encryption 以更新該物件的 Always Encrypted 中繼資料。

限制

下列限制適用於加密資料行的查詢:

  • 使用隨機加密進行加密的資料行不允許執行計算。 確定性加密支援有關相等比較的下列作業 - 不允許其他作業。

    注意

    針對需要執行模式比對、使用比較運算子、排序和索引加密資料行的應用程式,您應該實作具有安全隔離區的 Always Encrypted

  • 若查詢陳述式會同時觸發純文字和加密資料相關計算,則不允許使用。 例如:

    • 比較加密資料行與純文字資料行或常值。
    • 將純文字資料行的資料複製至加密資料行 (或反向) UPDATEBULK INSERTSELECT INTOINSERT..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 StudioSSMS 中,必須套用 Always Encrypted 變數的參數化,才能執行處理與加密資料行相關值的查詢。 這包括將資料插入加密資料行,或是在資料套用篩選條件等案例 (在使用確定性加密的情況)。

  • 不支援目標為加密資料行的資料表值參數

  • 不支援使用下列子句的查詢:

  • 具下列特性的資料行不支援 Always Encrypted:

    重要

    Stretch Database 在 SQL Server 2022 (16.x) 及 Azure SQL 資料庫中已被取代。 資料庫引擎的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

    • 外部 (PolyBase) 資料表中的資料行 (附註:支援使用外部資料表和包含加密資料行的資料表)。
  • 下列功能無法在加密的資料行運作:

Always Encrypted Transact-SQL 參考

Always Encrypted 使用下列 Transact-SQL 陳述式、系統目錄檢視、系統預存程序和權限。

陳述式

DDL 陳述式 說明
建立資料行主要金鑰 在資料庫建立資料行主要金鑰中繼資料物件
DROP COLUMN MASTER KEY 從資料庫中卸除資料行主要金鑰。
建立資料行加密金鑰 建立資料行加密金鑰中繼資料物件。
ALTER COLUMN ENCRYPTION KEY 改變資料庫中資料行的加密金鑰,新增或卸除加密的值。
DROP COLUMN ENCRYPTION KEY 從資料庫中卸除資料行加密金鑰。
CREATE TABLE (ENCRYPTED WITH) 指定加密資料行

系統目錄檢視和預存程序

系統目錄檢視和預存程序 說明
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 有四項資料庫權限。

系統目錄檢視和預存程序 說明
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 DEFINITIONVIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限,以保護資料行,且無法存取純文字嘗試。

  • 在 SQL Server 中,VIEW ANY COLUMN MASTER KEY DEFINITIONVIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限預設皆會授與公用固定資料庫角色。 資料庫管理員可選擇撤銷 (或拒絕) 授與給公用角色的權限,而是將這些權限授與給特定角色或使用者,以實作更嚴格的控制。

  • 在 SQL Database 中,VIEW ANY COLUMN MASTER KEY DEFINITIONVIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限預設不會授與公用固定資料庫角色。 這可讓某些現有的舊版工具 (使用舊版 DacFx) 正常運作。 若要使用加密資料行 (即使未進行解密),資料庫管理員必須明確授與 VIEW ANY COLUMN MASTER KEY DEFINITIONVIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限。

後續步驟