Spring Security 加密模組
Spring Security Crypto 模組提供對稱加密、金鑰產生和密碼編碼的支援。此程式碼作為核心模組的一部分發布,但不依賴任何其他 Spring Security(或 Spring)程式碼。
加密器
Encryptors
類別提供用於建構對稱加密器的工廠方法。此類別讓您建立 BytesEncryptor
實例,以加密原始 byte[]
格式的資料。您也可以建構 TextEncryptor 實例來加密文字字串。加密器是執行緒安全的。
|
BytesEncryptor
您可以使用 Encryptors.stronger
工廠方法來建構 BytesEncryptor
-
Java
-
Kotlin
Encryptors.stronger("password", "salt");
Encryptors.stronger("password", "salt")
stronger
加密方法透過使用具有 Galois Counter Mode (GCM) 的 256 位元 AES 加密來建立加密器。它透過使用 PKCS #5 的 PBKDF2(基於密碼的金鑰衍生函數 #2)來衍生密鑰。此方法需要 Java 6。用於產生 SecretKey
的密碼應保存在安全的地方,且不應共用。salt 用於防止字典攻擊金鑰,以防您的加密資料外洩。還應用了 16 位元組的隨機初始化向量,以便每個加密訊息都是唯一的。
提供的 salt 應採用十六進位編碼的字串格式,為隨機,且長度至少為 8 個位元組。您可以使用 KeyGenerator
來產生此類 salt
-
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。此模式未經過驗證,並且不提供有關資料真實性的任何保證。為了獲得更安全的替代方案,請使用 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
模組的密碼套件提供對密碼編碼的支援。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 位元組 salt 值,並且是一種刻意降低速度的演算法,以阻礙密碼破解者。您可以使用 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))