此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Security 6.5.3! |
Spring Security 加密模块
Spring Security Crypto模块支持对称加密,密钥生成和密码编码。 该代码作为核心模块的一部分分发,但不依赖于任何其他 Spring Security(或 Spring)代码。
加密器
这Encryptors
class 提供了用于构造对称加密器的工厂方法。
此类允许您创建BytesEncryptor
实例以加密原始数据byte[]
形式。
您还可以构造TextEncryptor
实例来加密文本字符串。
加密器是线程安全的。
双 |
字节加密器
您可以使用Encryptors.stronger
factory 方法来构造一个BytesEncryptor
:
-
Java
-
Kotlin
Encryptors.stronger("password", "salt");
Encryptors.stronger("password", "salt")
这stronger
加密方法使用 256 位 AES 加密创建加密器,并
伽罗瓦计数器模式 (GCM)。
它使用 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
class 提供了许多方便的工厂方法,用于构造不同类型的密钥生成器。
通过使用此类,您可以创建一个BytesKeyGenerator
生成byte[]
钥匙。
您还可以构造一个StringKeyGenerator
生成字符串键。KeyGenerators
是一个线程安全的类。
字节密钥生成器
您可以使用KeyGenerators.secureRandom
factory 方法生成BytesKeyGenerator
由SecureRandom
实例:
-
Java
-
Kotlin
BytesKeyGenerator generator = KeyGenerators.secureRandom();
byte[] key = generator.generateKey();
val generator = KeyGenerators.secureRandom()
val key = generator.generateKey()
默认密钥长度为 8 字节。 一个KeyGenerators.secureRandom
variant 提供对键长度的控制:
-
Java
-
Kotlin
KeyGenerators.secureRandom(16);
KeyGenerators.secureRandom(16)
使用KeyGenerators.shared
factory 方法来构造一个 BytesKeyGenerator,该 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;
}
}
这matches
如果rawPassword
,一旦编码,等于encodedPassword
.
此方法旨在支持基于密码的身份验证方案。
这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 是一种故意缓慢的算法,应调整为大约需要 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))