Spring Security 暗号モジュール
Spring Security Crypto モジュールは、対称暗号化、キー生成、パスワードエンコーディングのサポートを提供します。コードはコアモジュールの一部として配布されますが、他の Spring Security(または Spring)コードには依存しません。
暗号化
Encryptors (Javadoc) クラスは、対称暗号化を構築するためのファクトリメソッドを提供します。このクラスを使用すると、BytesEncryptor (Javadoc) インスタンスを作成して、生の byte[] 形式でデータを暗号化できます。TextEncryptor (Javadoc) インスタンスを作成して、テキスト文字列を暗号化することもできます。暗号化機能はスレッドセーフです。
|
BytesEncryptor
Encryptors.stronger ファクトリメソッドを使用して BytesEncryptor を作成できます。
Java
Kotlin
Encryptors.stronger("password", "salt");
Encryptors.stronger("password", "salt")
stronger 暗号化方式は、ガロアカウンターモード(GCM)で 256 ビット AES 暗号化を使用して暗号化装置を作成します。PKCS#5 の PBKDF2(パスワードベースの鍵導出関数 #2)を使用して秘密鍵を導出します。この方法には Java 6 が必要です。SecretKey の生成に使用されるパスワードは、安全な場所に保管し、共有しないでください。ソルトは、暗号化されたデータが危険にさらされた場合に、キーに対する辞書攻撃を防ぐために使用されます。暗号化された各メッセージが一意になるように、16 バイトのランダム初期化ベクトルも適用されます。
提供されるソルトは、16 進数でエンコードされた文字列形式で、ランダムで、長さが 8 バイト以上である必要があります。KeyGenerator を使用して、このようなソルトを生成できます。
Java
Kotlin
String salt = KeyGenerators.string().generateKey(); // generates a random 8-byte salt that is then hex-encoded
val salt = KeyGenerators.string().generateKey() // generates a random 8-byte salt that is then hex-encoded
standard 暗号化方式を使用することもできます。これは暗号ブロック連鎖(CBC)モードの 256 ビット AES です。このモードは認証 [Wikipedia] されておらず、データの信頼性について保証するものではありません。より安全な代替手段として、Encryptors.stronger を使用してください。
キージェネレーター
KeyGenerators (Javadoc) クラスは、さまざまな型のキージェネレーターを構築するための便利なファクトリメソッドを多数提供します。このクラスを使用すると、BytesKeyGenerator (Javadoc) を作成して byte[] キーを生成できます。また、StringKeyGenerator (Javadoc) を作成して文字列キーを生成することもできます。KeyGenerators はスレッドセーフなクラスです。
BytesKeyGenerator
KeyGenerators.secureRandom ファクトリメソッドを使用して、SecureRandom インスタンスに基づく BytesKeyGenerator を生成できます。
Java
Kotlin
BytesKeyGenerator generator = KeyGenerators.secureRandom();
byte[] key = generator.generateKey();
val generator = KeyGenerators.secureRandom()
val key = generator.generateKey()
デフォルトのキー長は 8 バイトです。KeyGenerators.secureRandom バリアントは、キーの長さを制御します。
Java
Kotlin
KeyGenerators.secureRandom(16);
KeyGenerators.secureRandom(16)
KeyGenerators.shared ファクトリメソッドを使用して、すべての呼び出しで常に同じキーを返す BytesKeyGenerator を作成します。
Java
Kotlin
KeyGenerators.shared(16);
KeyGenerators.shared(16)
パスワードエンコーディング
spring-security-crypto モジュールのパスワードパッケージは、パスワードのエンコードをサポートします。PasswordEncoder は主要サービスインターフェースであり、次の署名があります。
public interface PasswordEncoder {
String encode(CharSequence rawPassword);
boolean matches(CharSequence rawPassword, String encodedPassword);
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}rawPassword がエンコードされると、encodedPassword と等しい場合、matches メソッドは true を返します。この方法は、パスワードベースの認証スキームをサポートするように設計されています。
BCryptPasswordEncoder 実装は、広くサポートされている "bcrypt" アルゴリズムを使用してパスワードをハッシュします。Bcrypt はランダムな 16 バイトのソルト値を使用し、パスワードクラッカーを妨げるために意図的に遅いアルゴリズムです。4 から 31 までの値をとる strength パラメーターを使用して、実行する作業量を調整できます。値が大きいほど、ハッシュを計算するためにより多くの作業を行う必要があります。デフォルト値は 10 です。値はエンコードされたハッシュにも保存されるため、既存のパスワードに影響を与えることなく、デプロイされたシステムでこの値を変更できます。次の例では、BCryptPasswordEncoder を使用しています。
Java
Kotlin
// Create an encoder with strength 16
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
// Create an encoder with strength 16
val encoder = BCryptPasswordEncoder(16)
val result: String = encoder.encode("myPassword")
assertTrue(encoder.matches("myPassword", result))
Pbkdf2PasswordEncoder 実装は、PBKDF2 アルゴリズムを使用してパスワードをハッシュします。パスワードクラッキングを打ち負かすために、PBKDF2 は意図的に遅いアルゴリズムであり、システムのパスワードを確認するのに約 0.5 秒かかるように調整する必要があります。次のシステムは Pbkdf2PasswordEncoder を使用しています。
Java
Kotlin
// Create an encoder with all the defaults
Pbkdf2PasswordEncoder encoder = Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
// Create an encoder with all the defaults
val encoder = Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8()
val result: String = encoder.encode("myPassword")
assertTrue(encoder.matches("myPassword", result))