Jasyptの紹介

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());

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

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

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

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暗号化アルゴリズム の設定

より強力な暗号化アルゴリズムを使用できますが、http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html[Java Cryptography Extension(JCE)無制限強度管轄ポリシー]のインストールを忘れないでください私たちのJVMのためのファイル](インストール手順はダウンロードに含まれています)。

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マルチスレッド復号化の使用

マルチコアマシンで作業しているときは、復号化の処理を並行して処理したいと思います。優れたパフォーマンスを達成するために、 PooledPBEStringEncryptor および setPoolSize() APIを使用することができます。蒸解釜のプールを作ります。それらのそれぞれは、異なるスレッドによって並行して使用することができます。

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

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

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

ちょっと最後に、 Jasypt ライブラリはもちろん Spring Frameworkを含む他の多くのライブラリと統合できることです。

Springアプリケーションに暗号化サポートを追加するための設定を作成するだけです。機密データをデータベースに格納し、データアクセスフレームワークとして Hibernate を使用している場合は、それに Jasypt を統合することもできます。

これらの統合についての説明は、他のいくつかのフレームワークと同様に、http://www.jasypt.org/[Jasypt’s home page]の Guides セクションにあります。

7. 結論

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

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/libraries[GitHubプロジェクト]にあります - これはMavenプロジェクトです。そのまま実行します。