プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2017/09/09

SQL Server 2016 Express の暗号化

event_note2017/09/09 3:32

SQL Server 2016 Express の暗号化機能として、Always Encrypted 機能というのがあるようです。

Always Encrypted 機能について

以下の URL で示されているように、クライアント側 (ADO.NET Library 内) で暗号・復号処理が行われようです。

これを使用することによるメリットとして、

  • クライアントアプリケーション側で暗号・復号を意識する必要がなくなる
  • サーバー側のデータが常に暗号化される(通信上のデータまで暗号化される)
  • サーバー側の負荷が小さくなる(クライアント側の負荷が大きくなる)

が挙げられます。

暗号処理の適用方法

適用方法の流れは以下の通りです。

  1. 自己署名証明書の作成
  2. 暗号鍵の作成
  3. テーブル暗号化

自己署名証明書の作成

自己署名証明書の作成方法は主に2通りあるようです。

ここでは makecert.exe pvk2pfx.exe を使用し、自己署名証明書を作成します。

私の環境ではこれらの exe は C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x64 にありました。

まずは makecert.exe で証明書ファイル (CER) と秘密鍵ファイル (PVK) を作成します。
以下、コマンド例です。

makecert -r -pe -n "CN=AE Test" -a sha1 -b 01/01/2000 -e 01/01/2100 -sky exchange -sv test.pvk test.cer

コマンドの内容については以下を参照してください。

次に個人情報交換ファイル (PFX) を作成します。
以下、コマンド例です。

pvk2pfx -pvk test.pvk -pi 1234 -spc test.cer -pfx test.pfx -po 1234

コマンドの内容については以下を参照してください。

証明書のインポート

前節で作成した証明書を PC にインポートします。

[ファイル名を指定して実行]から certmgr.msc を実行し、現在のユーザーの証明書マネージャーツール起動します。
※ちなみにローカルコンピューターの証明書マネージャーツールは certlm.msc で起動します。

[個人]を右クリックし、[すべてのタスク] > [インポート]を選択します。

[証明書のインポート ウィザード]で、[次へ]をクリックします。 [インポートする証明書ファイル]ページで、前節で作成した個人情報交換ファイル (PFX) を選択します。 ※[ファイルの種類]で[Personal Information Exchange (*.pfx; *.p12)]を選択する必要があります。

秘密キーのパスワードは、PFX ファイルに割り当てられているパスワードを入力します。 [証明書ストア]ページで、[証明書をすべて次のストアに配置する]を選択し、[次へ]をクリックします。

以上でインポートは完了です。

暗号鍵の作成

CMK (Column Master Key) と CEK (Column Encryption Key) の2種類の鍵が必要です。

名称 内容
CMK CEK を保護するための鍵。前節で作成した証明書の情報が記録される
CEK テーブルの列を暗号化するための鍵

SQL Server Management Studio より、上記の鍵を作成します(Transact-SQL でも可)。

CMK の場合

対象のデータベースの [セキュリティ] > [常に暗号化されたキー] > [列マスターキー] を右クリックし、[新しい列マスターキー] を選択します。

任意の名前を入力し、前節でインポートした証明書を選択し、OK をクリックします。

CEK の場合

対象のデータベースの [セキュリティ] > [常に暗号化されたキー] > [列の暗号化キー] を右クリックし、[新しい列の暗号化キー] を選択します。

任意の名前を入力し、上記の列マスターキーを選択し、OK をクリックします。

テーブルの暗号化

暗号化するテーブルを右クリックし、[列の暗号化] をクリックします。

暗号化したい列にチェックを入れます。 暗号の種類は「決定論的」と「ランダム化」を選択できますが、暗号化した列を WHERE 句の条件として使用する場合は「決定論的」を選択します。 暗号化キーは前節で作成した CEK を選択します。

暗号化は以上で完了です。

アプリケーション側での利用方法

アプリケーション側で Always Encrypted 機能を使用する手順は以下です。

  • 証明書のインポート
  • 接続文字列の追加
  • SqlParameter クラスの使用

証明書のインポート

手順は前章と同じなので省略します。

接続文字列の追加

データベースの接続文字列に Column Encryption Setting=enabled を追加する必要があります。
Entity Framework を使用する場合はこれだけで OK です。
尚、Entity Framework Core は現在 Always Encrypted には未対応です。

参考 URL