1. 概要

この記事では、 Jasypt (Java Simplified Encryption)ライブラリについて説明します。

Jasyptは、開発者が最小限の労力でプロジェクトに基本的な暗号化機能を追加できるようにするJavaライブラリであり、暗号化プロトコルの実装の詳細に関する深い知識は必要ありません。

2. 単純な暗号化の使用

ユーザーがアカウントのプライベートデータを送信するWebアプリケーションを構築していると考えてください。 そのデータをデータベースに保存する必要がありますが、プレーンテキストを保存するのは安全ではありません。

これに対処する1つの方法は、暗号化されたデータをデータベースに保存し、特定のユーザーのデータを取得するときにデータを復号化することです。

非常に単純なアルゴリズムを使用して暗号化と復号化を実行するには、JasyptライブラリのBasicTextEncryptorクラスを使用できます。

BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
String privateData = "secret-data";
textEncryptor.setPasswordCharArray("some-random-data".toCharArray());

次に、 encode()メソッドを使用してプレーンテキストを暗号化できます。

String myEncryptedText = textEncryptor.encrypt(privateData);
assertNotSame(privateData, myEncryptedText);

特定のユーザーのプライベートデータをデータベースに保存する場合は、セキュリティ制限に違反することなく、myEncryptedTextを保存できます。 データを復号化してプレーンテキストに戻したい場合は、 decode()メソッドを使用できます。

String plainText = textEncryptor.decrypt(myEncryptedText);
 
assertEquals(plainText, privateData);

復号化されたデータは、以前に暗号化されたプレーンテキストデータと同じであることがわかります。

3. 一方向暗号化

前の例は、認証を実行する理想的な方法ではありません。つまり、ユーザーパスワードを保存する場合です。 理想的には、パスワードを復号化せずに暗号化する必要があります。 ユーザーが私たちのサービスにログインしようとすると、私たちは彼のパスワードを暗号化し、データベースに保存されている暗号化されたパスワードと比較します。 そうすれば、プレーンテキストのパスワードを操作する必要がなくなります。

BasicPasswordEncryptor クラスを使用して、一方向の暗号化を実行できます。

String password = "secret-pass";
BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor();
String encryptedPassword = passwordEncryptor.encryptPassword(password);

次に、すでに暗号化されているパスワードを、データベースにすでに保存されているパスワードを復号化することなく、ログインプロセスを実行するユーザーのパスワードと比較できます。

boolean result = passwordEncryptor.checkPassword("secret-pass", encryptedPassword);

assertTrue(result);

4. 暗号化のアルゴリズムの構成

より強力な暗号化アルゴリズムを使用できますが、JVM用に Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files をインストールすることを忘れないでください(インストール手順はダウンロードに含まれています)。

Jasyptでは、 StandardPBEStringEncryptor クラスを使用して強力な暗号化を使用し、 setAlgorithm()メソッドを使用してカスタマイズできます。

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
String privateData = "secret-data";
encryptor.setPassword("some-random-passwprd");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

暗号化アルゴリズムを次のように設定しましょう PBEWithMD5AndTripleDES。

次に、暗号化と復号化のプロセスは、BasicTextEncryptorクラスを使用した前のプロセスと同じように見えます。

String encryptedText = encryptor.encrypt(privateData);
assertNotSame(privateData, encryptedText);

String plainText = encryptor.decrypt(encryptedText);
assertEquals(plainText, privateData);

5. マルチスレッド復号化の使用

マルチコアマシンで動作している場合、復号化の処理を並行して処理する必要があります。 優れたパフォーマンスを実現するために、 PooledPBEStringEncryptorsetPoolSize()APIを使用してダイジェスターのプールを作成できます。 それらのそれぞれは、異なるスレッドで並行して使用できます。

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setPoolSize(4);
encryptor.setPassword("some-random-data");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

プールのサイズをマシンのコアの数と等しくなるように設定することをお勧めします。 暗号化と復号化のコードは以前のものと同じです。

6. 他のフレームワークでの使用

最後に、 Jasypt ライブラリは、もちろん Spring Frameworkを含む、他の多くのライブラリと統合できることに注意してください。

Springアプリケーションに暗号化サポートを追加するための構成を作成するだけで済みます。 また、機密データをデータベースに保存する必要があり、データアクセスフレームワークとして Hibernate を使用している場合は、Jasyptを統合することもできます。

これらの統合、および他のいくつかのフレームワークに関する説明は、Jasyptのホームページガイドセクションにあります。

7. 結論

この記事では、すでによく知られ、テストされた暗号化アルゴリズムを使用して、より安全なアプリケーションを作成するのに役立つJasyptライブラリについて説明しました。 使いやすいシンプルなAPIでカバーされています。

これらすべての例とコードスニペットの実装は、 GitHubプロジェクトにあります。これはMavenプロジェクトであるため、そのままインポートして実行するのは簡単です。