最新の安定バージョンについては、Spring Security 6.3.1 を使用してください! |
Spring Security 暗号モジュール
導入
Spring Security Crypto モジュールは、対称暗号化、キー生成、パスワードエンコーディングのサポートを提供します。コードはコアモジュールの一部として配布されますが、他の Spring Security(または Spring)コードには依存しません。
暗号化
Encryptors クラスは、対称暗号化機能を構築するためのファクトリメソッドを提供します。このクラスを使用すると、ByteEncryptors を作成して生の byte[] 形式でデータを暗号化できます。TextEncryptors を構築して、テキスト文字列を暗号化することもできます。暗号化はスレッドセーフです。
BytesEncryptor
Encryptors.stronger
ファクトリメソッドを使用して BytesEncryptor を構築します。
Java
Kotlin
Encryptors.stronger("password", "salt");
Encryptors.stronger("password", "salt")
「より強力な」暗号化方式では、ガロアカウンターモード(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
暗号化方式を使用することもできます。これは、Cipher Block Chaining(CBC)モードの 256 ビット AES です。このモードは認証 [Wikipedia] されておらず、データの信頼性については保証されません。より安全な代替策として、ユーザーは Encryptors.stronger
を優先する必要があります。
TextEncryptor
Encryptors.text ファクトリメソッドを使用して、標準の TextEncryptor を作成します。
Java
Kotlin
Encryptors.text("password", "salt");
Encryptors.text("password", "salt")
TextEncryptor は、標準の BytesEncryptor を使用してテキストデータを暗号化します。暗号化された結果は、ファイルシステムまたはデータベースに簡単に保存できるように、16 進数でエンコードされた文字列として返されます。
Encryptors.queryableText ファクトリメソッドを使用して、「クエリ可能な」TextEncryptor を構築します。
Java
Kotlin
Encryptors.queryableText("password", "salt");
Encryptors.queryableText("password", "salt")
照会可能な TextEncryptor と標準 TextEncryptor の違いは、初期化ベクトル(iv)処理に関係しています。クエリ可能な TextEncryptor#encrypt 操作で使用される iv は、共有または定数であり、ランダムに生成されません。つまり、同じテキストを複数回暗号化すると、常に同じ暗号化結果が生成されます。これは安全性は低くなりますが、照会する必要がある暗号化されたデータには必要です。クエリ可能な暗号化されたテキストの例は、OAuth apiKey です。
キージェネレーター
KeyGenerators クラスは、さまざまな型のキージェネレーターを構築するための便利なファクトリメソッドをいくつか提供します。このクラスを使用すると、BytesKeyGenerator を作成して byte[] キーを生成できます。StringKeyGenerator を構築して、文字列キーを生成することもできます。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 の値を取る「強度」パラメーターを使用して、それが行う作業量を調整できます。値が高いほど、ハッシュを計算するためにより多くの作業を行う必要があります。デフォルト値は 10 です。値はエンコードされたハッシュにも保存されるため、既存のパスワードに影響を与えることなく、デプロイされたシステムでこの値を変更できます。
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 秒かかるように調整する必要があります。
Java
Kotlin
// Create an encoder with all the defaults
Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
// Create an encoder with all the defaults
val encoder = Pbkdf2PasswordEncoder()
val result: String = encoder.encode("myPassword")
assertTrue(encoder.matches("myPassword", result))