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