サンプルアプリケーション
サンプルアプリケーションは、引数としてnameを1つ取って下記のテーブルに対してクエリを実行し、該当レコードを表示するという、とても単純なアプリケーションとなります。
.NET Framework 4.5.2を使用したコンソールアプリケーションで、実行すると以下のように素っ気なく、該当レコードを表示してくれます。
……えっと、まあ、なんというか、アレな感じですが、普段コード書かない仕事なので、今回はこれくらいで勘弁してください(涙)。
動作としては、上記のようなとても簡素ですが、移行シナリオの都合上、きちんと以下のことは実装しています。
1) 引数をSqlParameterとしてバインドしている
2) 接続文字列はConfigurationファイルから読み込んでいる
さて、サンプルアプリケーションについて説明したところで、早速Always Encrypted対応を進めていきます。
暗号化するカラムと暗号化の方式を考える
Always Encryptedでは、下記の表のように2種類の暗号化の方式をサポートしています。前述のとおり、customersテーブルは、3つのカラムを持っていますので、これらのカラムの内、どのカラムをどの方式で暗号化するか検討します。
Randomized encryptionの方が、より安全ということになりますが、検索条件としては使用できないので、適用するカラムを選ぶ必要があります。
今回のサンプルアプリケーションでは、nameカラムを検索条件としているので、必然的にnameカラムの暗号化方式はDeterministic encryptionになります。cardnumberカラムについては、どっちでもいいのですが、まあ、折角なのでRandomized encryptionを選ぶことにします。
さて、既存のアプリケーションである以上、すでにテーブルも存在しており、データを保持した状態です。この状態から、直接ALTER TABLE等でAlways Encryptedに対応したテーブルに変更はできません。SQL ServerはCMKにアクセスできないので、CEKを使用してデータを暗号化できないですからね。
ということで、一旦、別の名前でテーブルを作りましょう。こんな感じで、nameカラムとcardnumber カラムをCEKを使用して暗号化カラムとして指定します。