Always Encrypted - 查詢加密數據行的運作方式
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體
若要在加密的資料庫數據行上執行查詢,請將數據插入這些數據行、擷取純文字值,或使用確定性加密執行支援的作業(例如點查閱搜尋),發出查詢的使用者或應用程式必須滿足下列必要條件:
- 可存取保護資料的資料行主要金鑰。 除了資料庫層級許可權之外,還需要此密鑰存取權,例如相關數據表上的SELECT。
- 連線至資料庫,且資料庫連線啟用 Always Encrypted。 大部分的 SQL 工具和 SQL 用戶端驅動程式皆支援資料庫連線啟用 Always Encrypted。
注意
若使用者具備讀取資料所需的資料庫權限,但無法存取保護資料的金鑰,使用者仍可連線至資料庫並擷取加密文字資料,而無須在資料庫連線中啟用 Always Encrypted。
以下是加密資料行的查詢運作方式:
- 當應用程式發出參數化查詢時,應用程式內的 SQL 用戶端驅動程式會以透明方式連絡 資料庫引擎(藉由呼叫 sp_describe_parameter_encryption 來判斷哪些參數是以加密數據行為目標,而且應該加密。 針對每個需要加密的參數,驅動程式會收到加密演算法、加密類型和金鑰中繼資料,包含加密的資料行加密金鑰及其對應資料行主要金鑰的位置。
- 驅動程式會呼叫金鑰存放區,其中包含資料行主要金鑰,以便解密加密資料行的加密金鑰值。 系統會快取產生的純文字資料行加密金鑰,以減少後續使用相同資料行加密金鑰的金鑰存放區來回行程。
- 驅動程式會使用取得的純文字資料行加密金鑰,以加密對應至加密資料行的查詢參數。
- 針對目標為加密資料行的參數,驅動程式會以加密值取代該參數的純文字值,並將查詢傳送至伺服器進行處理。
- 資料庫引擎會執行查詢,這可能會對使用確定性加密的資料行進行相等比較。
- 若查詢結果包含加密資料行的資料,資料庫引擎便會將各資料行的加密中繼資料 (包含加密演算法、加密類型和金鑰中繼資料的相關資訊) 附加至結果集。
- 資料庫引擎會將結果集傳送至用戶端應用程式。
- 針對所接收結果集中的各個加密資料行,驅動程式會先嘗試在本機快取中尋找純文字資料行加密金鑰;若在快取中找不到金鑰,只會在存放資料行主要金鑰的金鑰存放區中進行一次來回行程。
- 驅動程式會解密結果,並將純文字值傳回給應用程式。
用戶端驅動程式會使用資料行主要金鑰存放區提供者與包含資料行主要金鑰的金鑰存放區互動,後者是用戶端軟體元件,其中封裝包含資料行主要金鑰的金鑰存放區。 Microsoft 的用戶端驅動程式程式庫可使用常見類型的金鑰存放區提供者,或可作為獨立下載項目。 您也可以實作自己的提供者。 Always Encrypted 功能 (包括內建的資料行主要金鑰存放區提供者) 會因驅動程式庫及其版本而異。
如如需支援 Always Encrypted 的用戶端驅動程式清單,請參閱使用 Always Encrypted 開發應用程式,以取得有關查詢加密資料行的應用程式開發相關資訊。
您也可以使用 SQL 工具查詢加密的數據行,例如使用 Always Encrypted 搭配 Azure Data Studio 查詢數據行,或使用 Always Encrypted 搭配 SQL Server Management Studio 查詢數據行。