Always Encrypted

Always Encryptedで暗号化されたカラムを更新してみた

JDBC接続文字列に「columnEncryptionSetting=Enabled」を追加し、Azure Key Vault に対する認証を行うための設定を追加することで、Always Encryptedで暗号化したカラムの取得に加え、更新も行うことができる。

今回は、Always Encryptedで暗号化したカラムを更新してみたので、そのサンプルプログラムを共有する。また、SSMS(SQL Server Management Studio)上での、Always Encryptedで暗号化したカラムの更新方法についても、サンプルプログラムの実行結果の中で共有する。

前提条件

下記記事の実装が完了していること。

Always Encryptedで暗号化されたカラムを復号化して表示してみたAlways Encryptedで暗号化したカラムは、Always Encryptedにより暗号化されたカラムを復号化できる設定を追加す...

作成したサンプルプログラム(App Service側)の内容

作成したサンプルプログラム(App Service側)の構成は以下の通り。
サンプルプログラムの構成(AppService)
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。

コントローラクラスの内容は以下の通りで、パスワードを更新する処理を追加している。

また、HTMLの内容は以下の通りで、パスワードの更新を行う機能を追加している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/always-encrypted-update/demoAzureApp



作成したサンプルプログラム(Azure Functions側)の内容

作成したサンプルプログラム(Azure Functions側)の構成は以下の通り。
サンプルプログラムの構成(AzureFunctions)
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。

<2021年4月13日 追記>
spring-cloud-function-dependenciesのバージョンは、2021年3月16日にリリースしたバージョン3.1.2を利用すると、1つのAzure Functions内に複数のファンクションを含む場合の不具合が解消できている。


その場合、Handlerクラスの継承するクラスを「AzureSpringBootRequestHandler」クラスから「FunctionInvoker」クラスに変更する。


spring-cloud-function-dependenciesの3.1.2を利用した実装サンプルは、以下の記事を参照のこと。

spring-cloud-function-dependenciesのバージョンを最新(3.1.2)にしてみたこれまでこのブログで取り上げてきたAzure Functionsのサンプルプログラムでは、spring-cloud-function-d...

USER_PASSテーブルにアクセスするMapperクラス・Mapper XMLの内容は以下の通りで、USER_PASSテーブルを更新する処理を追加している。

また、USER_PASSテーブルを更新する処理を呼び出すサービスクラスと、その入出力項目の内容は、以下の通り。



さらに、Azure Functionsのメインクラスは以下の通りで、USER_PASSテーブルを更新する処理を呼び出すサービスクラスを呼び出しを追加している。

また、ハンドラークラスの内容は以下の通りで、Azure App Serviceのコントローラクラスから呼ばれるupdUserPass関数である。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/always-encrypted-update/demoAzureFunc



サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1)「mvn azure-functions:deploy」コマンドによって、Azure Functions上にサンプルプログラムをデプロイする。
サンプルプログラムの実行結果_1

なお、Azure Functionsにデプロイする過程は、以下の記事の「Azure FunctionsへのSpring Bootを利用したJavaアプリケーションのデプロイ」を参照のこと。

Azure Functions上でSpring Bootを利用したJavaアプリケーションを作成してみた前回は、Azure Potal上でAzure Functionsを作成してみたが、今回は、前回作成したAzure FunctionsにS...

2)「mvn azure-webapp:deploy」コマンドによって、Azure App Service上にサンプルプログラムをデプロイする。
サンプルプログラムの実行結果_2

なお、Azure App Serviceにデプロイする過程は、以下の記事の「App ServiceへのSpring Bootを利用したJavaアプリケーションのデプロイ」を参照のこと。

Azure App Service上でSpring Bootを利用したJavaアプリケーションを作成してみた前回は、Azure Potal上でApp Serviceを作成してみたが、今回は、前回作成したApp ServiceにSpring Bo...

3) Azure App ServiceのURL「https://azureappdemoservice.azurewebsites.net/」とアクセスした場合の実行結果は、以下の通り。
サンプルプログラムの実行結果_3_1

なお、上記URLは、下記Azure App ServiceのURLから確認できる。
サンプルプログラムの実行結果_3_2

4) 「getUserPassの値を取得」ボタンを押下すると、以下のように、暗号化されたパスワードが復号化されて表示される。
サンプルプログラムの実行結果_4_1

サンプルプログラムの実行結果_4_2

5) 更新後のUserPassに「passAft1」を入力し、「UserPassを更新」ボタンを押下すると、以下のように、更新完了メッセージが表示される。
サンプルプログラムの実行結果_5_1

サンプルプログラムの実行結果_5_2

6) 再度「getUserPassの値を取得」ボタンを押下すると、以下のように、更新後のパスワードが復号化されて表示される。
サンプルプログラムの実行結果_6_1

サンプルプログラムの実行結果_6_2

7) このときのデータベースの値は、以下のようになる。

●復号化しなかった場合
サンプルプログラムの実行結果_7_1

●復号化した場合
サンプルプログラムの実行結果_7_2

なお、SSMS(SQL Server Management Studio)上で暗号化されたカラムを復号化し表示する方法は、下記記事の「SSMSで暗号化されたカラムを復号化し表示」を参照のこと。

SQL DatabaseのカラムをSSMSを使ってAlways Encryptedで暗号化してみたAlways Encryptedを利用すると、SQL DatabaseやSQL Serverのデータベースに格納された、クレジットカード...

8) SSMS上で暗号化されたカラムを更新するには、以下のようなコマンドを実行する。

 
サンプルプログラムの実行結果_8_1

 
サンプルプログラムの実行結果_8_2

9) Azure App ServiceのURL「https://azureappdemoservice.azurewebsites.net/」とアクセスし、「getUserPassの値を取得」ボタンを押下すると、SSMS上で更新したパスワードが復号化されて表示される。
サンプルプログラムの実行結果_9_1

サンプルプログラムの実行結果_9_2

要点まとめ

  • JDBC接続文字列に「columnEncryptionSetting=Enabled」を追加し、Azure Key Vault に対する認証を行うための設定を追加することで、Always Encryptedで暗号化したカラムの取得に加え、更新も行うことができる。