Spring Boot セキュリティ関連

API通信をAESで暗号化してみた

今回は、以前作成したREST API通信のプログラムを、共通鍵暗号方式の1つであるAES(Advanced Encryption Standard)を利用して暗号化するようにしてみたので、そのサンプルプログラムを共有する。

共通鍵暗号方式については、以下のサイトを参照のこと。
https://www.infraexpert.com/study/security4.html

前提条件

下記記事のサンプルプログラムの作成と前提条件のデータ作成が完了していること。

Spring BootのWEB画面上でREST APIを使ってリストを取得してみた前回は、クライアント側からサーバー側で、REST API接続によりユーザーデータを取得しクライアント側の画面に表示していたが、今回は、R...

サーバー側のプログラムの作成と実行

作成したサーバー側(demo_server)サンプルプログラムの構成は以下の通り。

なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

build.gradleの内容は以下の通りで、暗号化を行うための設定を追加している。



application.ymlの内容は以下の通りで、暗号化に必要な項目を追加している。 暗号化キー(key)は、16バイトの文字列を設定している。



フリーランスエンジニアのエージェントは就業中でも無料で登録できるITエンジニアには、フリーランスという働き方がある。フリーランスとは、会社や団体などに所属せず、仕事に応じて自由に契約する人のこ...

コントローラクラスの内容は以下の通りで、encryptメソッドでAESによる暗号化を行っている。なお、暗号化に必要な項目値は、application.ymlから取得している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-api-aes/demo_server

上記プログラムを作成し、Spring Bootアプリケーションを起動し、「http://localhost:8085/getUserDataList」にアクセスした結果は以下の通り。
サンプルプログラムの実行結果_サーバー側
名前(name)、性別(sex)、メモ(memo)を暗号化しているので、その内容が暗号化されていることが確認できる。

クライアント側のプログラムの作成と実行

作成したクライアント側(demo)サンプルプログラムの構成は以下の通り。

なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

build.gradleの内容は以下の通りで、暗号化を行うための設定を追加している。

application.ymlの内容は以下の通りで、暗号化に必要な項目を追加している。 暗号化キー(key)は、サーバー側と同じ文字列を設定している。

コントローラクラスの内容は以下の通りで、decryptメソッドでAESで暗号化した内容を復号化している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-api-aes/demo

サーバー・クライアント両方のSpring Bootアプリケーションを起動し、「http:// (ホスト名):8084」とアクセスすると、以下の画面が表示されることが確認できる。
サンプルプログラムの実行結果_クライアント側

要点まとめ

  • Cipherクラスを利用すると、共通鍵暗号方式の1つであるAESを利用した処理を簡単に実装できる。
  • AESで利用する暗号化キーは、鍵長を16バイト・24バイト・32バイトのいずれかに設定し、暗号化/復号化で同じ暗号化キーを利用する必要がある。