永遠加密

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控實例

Always Encrypted 的圖表。

具有安全記憶體保護區的 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,請遵循下列步驟:

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

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

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

    欄位主金鑰可存放於資料庫系統外的受信任金鑰庫,例如 Azure Key VaultWindows 憑證庫或硬體安全模組。 此步驟後,設置欄位加密金鑰,並以欄位主金鑰加密每把金鑰。

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

    如需管理 Always Encrypted 金鑰的詳細資訊,請參閱 Always Encrypted 的密鑰管理概觀

  2. 為包含敏感性資訊的特定資料庫數據行設定加密,以確保保護。 此步驟可能需要建立包含加密欄位的新資料表,或加密現有欄位與資料。 在設定欄位加密時,請指定加密演算法、欄位加密金鑰以保護資料,以及加密類型。 Always Encrypted 支援兩個加密類型:

    • 確定性加密 一律會針對指定的純文本值產生相同的加密值。 透過確定性加密,你可以對加密欄位進行點查找、等式連接、分組及索引。 然而,未經授權的使用者可能會透過檢視加密欄位中的模式來猜測加密值的資訊,尤其是當有少數可能的加密值集合,例如真/假或南北/東西區域。

    • 隨機化加密 會使用加密數據無法預測的方法。 每個相同的純文字輸入,都會產生不同的加密輸出。 此方法提升了隨機加密的安全性。

若要透過比較運算子進行模式匹配,以及對加密欄位進行排序與索引,請採用 Always Encrypted with secure enclaves 並應用隨機加密。 Always Encrypted (不含安全記憶體保護區)隨機加密不支援在加密的數據行上搜尋、分組、編製索引或聯結。 相反地,對於用於搜尋或分組目的的欄位,必須使用確定性加密。 此加密類型允許對加密欄位進行點查找、等式連接、分組及索引等操作。

由於資料庫系統設計上無法存取密碼金鑰,任何欄位加密都需要將資料移出並加密資料庫外。 加密過程可能耗時較長,且容易受到網路中斷的影響。 此外,若後續需要重新加密欄位,例如旋轉加密金鑰或更換加密類型,也會遇到同樣的困難。 使用 具有安全記憶體保護區的 Always Encrypted, 就不需要將數據移出資料庫。 由於 enclave 是被信任的,應用程式內的客戶端驅動程式或像 SQL Server Management Studio(SSMS)這類工具,可以在加密操作期間安全地與 Enclave 分享金鑰。 隔離區接著可以就地加密或重新加密資料行,大幅縮短這些動作所需的時間。

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

你可以透過 SQL 工具執行上述步驟:

為確保「永遠加密」金鑰及受保護的敏感資料不會以明文形式暴露給資料庫環境,資料庫引擎不得參與金鑰配置及資料加密或解密操作。 因此,Transact-SQL (T-SQL) 不支援金鑰佈建或密碼編譯作業。 基於相同原因,現有資料加密或重新加密 (使用不同的加密類型或資料行加密金鑰) 時必須在資料庫外部執行 (SQL 工具可自動化該作業)。

變更加密數據行的定義之後,請執行 sp_refresh_parameter_encryption 以更新 物件的 Always Encrypted 元數據。

限制

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

  • 你無法對用隨機加密加密的欄位進行計算。 確定性加密支援以下涉及等式比較的操作。 不允許其他操作:

    注意

    對於需要執行模式匹配、使用比較運算子、排序及索引加密欄位的應用程式,請實作 Always Encrypted 並搭配安全隔區

  • 你不能使用同時觸發明文和加密資料計算的查詢語句。 例如:

    • 比較加密資料行與純文字資料行或常值。
    • 將明文欄位的資料複製到加密欄位(或反過來) UPDATEBULK INSERTSELECT 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 開發應用程式

    SSMS 中,必須對 Always Encrypted 變數進行參數化,以執行處理與加密欄位相關值的查詢。 此要求包括將資料插入加密欄位或對其施加過濾器(若採用確定性加密時),情況會有所不同。

  • 不支援針對加密的欄位的表值參數

  • 不支援包含以下子句的查詢:

  • 以下欄位不支援「永遠加密」功能:

    • 使用下列其中一種數據類型的數據行: xmltimestamprowversionimagentexttextsql_varianthierarchyidgeographygeometryvector、alias、user-defined 類型。
    • FILESTREAM 欄位。
    • 具有 IDENTITY 屬性的欄位。
    • 具有 ROWGUIDCOL 屬性的數據行。
    • 字串(varcharchar 及其他)欄位,使用非 二進位碼點_BIN2排序規則的排序規則。 彙整不得與資料庫預設的彙整不同。
    • 使用隨機化加密時叢集和非叢集索引的索引鍵資料行 (支援使用確定性加密來編製資料行索引)。
    • 包含在全文檢索索引中的欄位(Always Encrypted 不支援 Full-Text 搜尋)。
    • 在資料表中指定計算數據列
    • 當計算欄位引用的欄位涉及不支援 Always Encrypted 的運算時。
    • 使用稀疏欄位
    • 使用隨機加密時, 統計數據 所參考的數據行(支援決定性加密)。
    • 分割欄位
    • 具有 預設約束的列。
    • 使用隨機加密時,唯一性約束條件所參考的欄位(支持決定性加密)。
    • 使用隨機加密時的主索引鍵資料行 (支援決定性加密)。
    • 在使用隨機加密或決定性加密時,若參考欄位和被參考欄位使用了不同的密鑰或演算法,則在外鍵約束中引用這些欄位。
    • 檢查條件約束所參考的列。
    • 具有 變更追蹤的數據表之主鍵欄。
    • 當記憶體 優化資料表 中的欄位被 原生編譯的模組引用時,該資料表中的任何欄位都無法加密。
      • 延展資料庫表中的欄位。 (包含使用 [永遠加密] 進行加密之資料行的資料表可針對 Stretch 啟用。)

    重要

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

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

Always Encrypted Transact-SQL 參考

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

陳述式

DDL 陳述式 Description
建立資料行主密鑰 在資料庫建立資料行主要金鑰中繼資料物件
DROP COLUMN MASTER KEY(刪除欄位主鍵) 從資料庫中卸除資料行主要金鑰。
建立欄位加密金鑰 建立資料行加密金鑰中繼資料物件。
ALTER COLUMN 加密金鑰 改變資料庫中資料行的加密金鑰,新增或卸除加密的值。
刪除列加密金鑰 從資料庫中卸除資料行加密金鑰。
建立資料表(加密) 指定加密資料行

系統目錄檢視和預存程序

系統目錄檢視和預存程序 Description
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 使用四個資料庫權限。

系統目錄檢視和預存程序 Description
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 中,public 固定的資料庫角色預設會授予VIEW ANY COLUMN MASTER KEY DEFINITIONVIEW ANY COLUMN ENCRYPTION KEY DEFINITION 兩種權限。 資料庫管理員可能會選擇撤銷或拒絕這些權限給 公開 角色,並授予特定角色或使用者,以實施更受限的控制。

  • 在 SQL 資料庫中, 公開 固定資料庫角色預設不會授予 VIEW ANY COLUMN MASTER KEY DEFINITIONVIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限。 此變更使某些使用舊版 DacFx 的舊有工具能正常運作。 若要處理加密欄位(即使不解密),資料庫管理員必須明確授予 VIEW ANY COLUMN MASTER KEY DEFINITION and VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 權限。

後續步驟