Always Encrypted - 暗号化された列に対するクエリのしくみ
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
暗号化されたデータベース列に対してクエリを実行するには、これらの列にデータを挿入したり、プレーンテキスト値を取得したり、決定論的暗号化を使用してサポートされている操作 (ポイント参照検索など) を実行したりするには、クエリを発行するユーザーまたはアプリケーションが次の前提条件を満たす必要があります。
- データを保護する列マスター キーにアクセスできます。 このキー アクセスは、関連するテーブルの SELECT など、データベース レベルのアクセス許可に加えて必要です。
- データベース接続で Always Encrypted を有効にしてデータベースに接続します。 ほとんどの SQL ツールと SQL クライアント ドライバーは、データベース接続に対して Always Encrypted を有効にすることをサポートしています。
Note
ユーザーがデータを読み取るために必要なデータベースアクセス許可を持っていても、データを保護するキーへのアクセス権がない場合でも、ユーザーはデータベース接続で Always Encrypted を有効にせずにデータベースに接続することで、暗号化された (暗号化された) データを取得できます。
暗号化された列に対するクエリのしくみを次に示します。
- アプリケーションがパラメーター化されたクエリを発行すると、アプリケーション内の SQL クライアント ドライバーは透過的にデータベース エンジンに接続します (sp_describe_parameter_encryptionを呼び出して、暗号化する必要がある列を対象とするパラメーターを決定します。 暗号化する必要がある各パラメーターについて、ドライバーは暗号化アルゴリズム、暗号化の種類、およびキー メタデータ (暗号化された列暗号化キーと、対応する列マスター キーの場所を含む) を受け取ります。
- ドライバーは、暗号化された列暗号化キー値を復号化するために、列マスター キーを含むキー ストアを呼び出します。 以降、同じ列の暗号化キーを使用する際に、キー ストアに対するラウンド トリップ数を軽減するために、結果のプレーンテキスト列暗号化キーはキャッシュされます。
- ドライバーは、取得したプレーンテキスト列暗号化キーを使用して、暗号化された列に対応するクエリ パラメーターを暗号化します。
- ドライバーは、暗号化された列を対象とするパラメーターのプレーンテキスト値を、暗号化値と置き換え、処理を実行するデータベース エンジンにクエリを送信します。
- データベース エンジンはクエリを実行します。これには、決定論的暗号化を使用した列の等価比較が含まれる場合があります。
- クエリ結果に暗号化された列のデータが含まれている場合、データベース エンジンは、暗号化アルゴリズム、暗号化の種類、キー メタデータに関する情報を含む各列の暗号化メタデータを結果セットにアタッチします。
- データベース エンジンは、結果セットをクライアント アプリケーションに送信します。
- 受信した結果セット内の暗号化された列ごとに、ドライバーはまずローカル キャッシュ内で平文の列暗号化キーを見つけようとします。キャッシュ内でキーが見つからない場合にのみ、列マスター キーを保持するキー ストアで検索されます。
- ドライバーは結果を復号化し、プレーンテキスト値をアプリケーションに返します。
クライアント ドライバーは、列マスター キー ストア プロバイダーを使用して、列マスター キーを含むキー ストアに接続します。このプロバイダーは、列マスター キーを含むキー ストアをカプセル化するクライアント側ソフトウェア コンポーネントです。 キー ストアの一般的な種類のプロバイダーは、Microsoft からのクライアント側ドライバーのライブラリで、またはスタンドアロンのダウンロードとして入手できます。 独自のプロバイダーを実装することもできます。 組み込みの列マスター キー ストア プロバイダーを含む Always Encrypted の機能は、ドライバー ライブラリとそのバージョンによって異なります。
Always Encrypted をサポートするクライアント ドライバーの一覧と、暗号化された列にクエリを実行するアプリケーションを開発する方法については、「Always Encrypted を使用したアプリケーションの開発」を参照してください。
暗号化された列のクエリは、SQL ツールを使用して実行することもできます。たとえば、Azure Data Studio で Always Encrypted を使用する Query 列 、SQL Server Management Studio で Always Encrypted を使用して Query 列。