Spring Security Crypto 模块
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 加密方法使用伽罗瓦/计数器模式 (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))