Spring Security 加密模組
Spring Security 加密模組為對稱加密、金鑰生成和密碼編碼提供支援。程式碼作為核心模組的一部分分發,但不依賴於任何其他 Spring Security(或 Spring)程式碼。
加密器
Encryptors 類提供了用於構建對稱加密器的工廠方法。該類允許您建立 BytesEncryptor
例項以加密原始 byte[]
形式的資料。您還可以構建 TextEncryptor
例項以加密文字字串。加密器是執行緒安全的。
BytesEncryptor 和 TextEncryptor 都是介面。BytesEncryptor 有多種實現。 |
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 位元組的隨機初始化向量,以使每個加密訊息都是唯一的。
提供的鹽值應為十六進位制編碼的字串形式,是隨機的,並且長度至少為 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。此模式未經認證,不提供關於資料真實性的任何保證。對於更安全的替代方案,請使用 Encryptors.stronger
。
金鑰生成器
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 模組的 password 包提供了對密碼編碼的支援。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 位元組鹽值,並且是一個故意設計得很慢的演算法,以阻止密碼破解者。您可以透過使用 strength 引數來調整其工作量,該引數接受 4 到 31 之間的值。值越高,計算雜湊所需的工作量就越大。預設值為 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))