Spring Security Crypto 模組

Spring Security Crypto 模組提供對稱加密、金鑰生成和密碼編碼支援。程式碼作為核心模組的一部分分發,不依賴於任何其他 Spring Security (或 Spring) 程式碼。

加密器

Encryptors 類提供用於構造對稱加密器的工廠方法。此類別允許您建立 BytesEncryptor 例項以原始 byte[] 形式加密資料。您還可以構造 TextEncryptor 例項以加密文字字串。加密器是執行緒安全的。

BytesEncryptorTextEncryptor 都是介面。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 位元組的隨機初始化向量,以便每個加密訊息都是唯一的。

提供的鹽應為十六進位制編碼的字串形式,隨機,且長度至少為 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

TextEncryptor

您可以使用 Encryptors.text 工廠方法來構造一個標準的 TextEncryptor

TextEncryptor
  • Java

  • Kotlin

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

TextEncryptor 使用標準的 BytesEncryptor 來加密文字資料。加密結果以十六進位制編碼的字串形式返回,以便於在檔案系統或資料庫中儲存。

金鑰生成器

KeyGenerators 類提供了許多便捷的工廠方法,用於構造不同型別的金鑰生成器。透過使用此類別,您可以建立 BytesKeyGenerator 以生成 byte[] 金鑰。您還可以構造 StringKeyGenerator 以生成字串金鑰。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 工廠方法來構造一個 8 位元組的 SecureRandom KeyGenerator,它將每個金鑰十六進位制編碼為 String

StringKeyGenerator
  • Java

  • Kotlin

KeyGenerators.string();
KeyGenerators.string()

密碼編碼

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

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))
© . This site is unofficial and not affiliated with VMware.