SQL Server 2016 Express の暗号化機能として、Always Encrypted 機能というのがあるようです。
Always Encrypted 機能について
以下の URL で示されているように、クライアント側 (ADO.NET Library 内) で暗号・復号処理が行われようです。
これを使用することによるメリットとして、
- クライアントアプリケーション側で暗号・復号を意識する必要がなくなる
- サーバー側のデータが常に暗号化される(通信上のデータまで暗号化される)
- サーバー側の負荷が小さくなる(クライアント側の負荷が大きくなる)
が挙げられます。
暗号処理の適用方法
適用方法の流れは以下の通りです。
- 自己署名証明書の作成
- 暗号鍵の作成
- テーブル暗号化
自己署名証明書の作成
自己署名証明書の作成方法は主に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
- https://enterprisezine.jp/dbonline/detail/7961
- https://blogs.technet.microsoft.com/junichia/2010/11/09/azure-for-itpro-3/
- http://tnakamura.hatenablog.com/entry/2014/08/28/123000
- https://knowledge.autodesk.com/ja/search-result/caas/CloudHelp/cloudhelp/2016/JPN/AutoCAD-Customization/files/GUID-19D6716A-0AD1-4A7A-82BA-A067E6D65F66-htm.html