Spring Security 暗号モジュール

Spring Security Crypto モジュールは、対称暗号化、キー生成、パスワードエンコーディングのサポートを提供します。コードはコアモジュールの一部として配布されますが、他の Spring Security(または Spring)コードには依存しません。

暗号化

Encryptors (Javadoc) クラスは、対称暗号化を構築するためのファクトリメソッドを提供します。このクラスを使用すると、BytesEncryptor (Javadoc) インスタンスを作成して、生の byte[] 形式でデータを暗号化できます。TextEncryptor (Javadoc) インスタンスを作成して、テキスト文字列を暗号化することもできます。暗号化機能はスレッドセーフです。

BytesEncryptor と TextEncryptor はどちらもインターフェースです。BytesEncryptor には複数の実装があります。

BytesEncryptor

Encryptors.stronger ファクトリメソッドを使用して BytesEncryptor を作成できます。

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 を使用してください。

TextEncryptor

Encryptors.text ファクトリメソッドを使用して、標準の TextEncryptor を作成できます。

TextEncryptor
  • Java

  • Kotlin

Encryptors.text("password", "salt");
Encryptors.text("password", "salt")

TextEncryptor は、標準の BytesEncryptor を使用してテキストデータを暗号化します。暗号化された結果は、ファイルシステムまたはデータベースに簡単に保存できるように、16 進エンコードされた文字列として返されます。

キージェネレーター

KeyGenerators (Javadoc) クラスは、さまざまな型のキージェネレーターを構築するための便利なファクトリメソッドを多数提供します。このクラスを使用すると、BytesKeyGenerator (Javadoc) を作成して byte[] キーを生成できます。StringKeyGenerator (Javadoc) ` を作成して、文字列キーを生成することもできます。KeyGenerators はスレッドセーフクラスです。

BytesKeyGenerator

KeyGenerators.secureRandom ファクトリメソッドを使用して、SecureRandom インスタンスに基づく BytesKeyGenerator を生成できます。

BytesKeyGenerator
  • Java

  • Kotlin

BytesKeyGenerator generator = KeyGenerators.secureRandom();
byte[] key = generator.generateKey();
val generator = KeyGenerators.secureRandom()
val key = generator.generateKey()

デフォルトのキー長は 8 バイトです。KeyGenerators.secureRandom バリアントは、キーの長さを制御します。

KeyGenerators.secureRandom
  • Java

  • Kotlin

KeyGenerators.secureRandom(16);
KeyGenerators.secureRandom(16)

KeyGenerators.shared ファクトリメソッドを使用して、すべての呼び出しで常に同じキーを返す BytesKeyGenerator を作成します。

KeyGenerators.shared
  • Java

  • Kotlin

KeyGenerators.shared(16);
KeyGenerators.shared(16)

StringKeyGenerator

KeyGenerators.string ファクトリメソッドを使用して、各キーを String として 16 進エンコードする 8 バイトの SecureRandomKeyGenerator を作成できます。

StringKeyGenerator
  • Java

  • Kotlin

KeyGenerators.string();
KeyGenerators.string()

パスワードエンコーディング

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 を使用しています。

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 を使用しています。

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