SpringSecurity------Spring Security Crypto(五)
- 说明
- Encryptors
-
- BytesEncryptor接口
- TextEncryptor接口
- Key Generators
- Password Encoding
说明
Spring Security Crypto模块支持对称加密、密钥生成和密码编码, 该代码作为核心模块的一部分分发,但不依赖于任何其他Spring Security(或Spring)代码。
Encryptors
Encryptors提供了构造对称加密器的工厂方法,使用这个类可以创建ByteEncryptor用来加密byte[]数据,还可以构造TextEncryptor来加密文本字符串,Encryptors是线程安全的。
BytesEncryptor接口
使用Encryptors.stronger()工厂方法可以创建一个BytesEncryptor实例
public static BytesEncryptor stronger(CharSequence password, CharSequence salt) {
return new AesBytesEncryptor(password.toString(), salt,KeyGenerators.secureRandom(16), CipherAlgorithm.GCM);
}
该加密方法使用256位AES加密和Galois计数器模式(GCM)创建加密器。它使用PKCS #5的PBKDF2(Password-Based Key Derivation Function #2)来派生密钥。 salt用于防止加密数据被泄露时dictionary attacks破解密钥。 该方法还应用了一个16字节的随机初始化向量,这样每个加密信息都是唯一的。 salt应该是十六进制编码的随机String,长度至少8字节, 这样的salt可以使用KeyGenerator生成 。
String salt = KeyGenerators.string().generateKey();
TextEncryptor接口
1、使用Encryptors.text()工厂方法可以创建一个TextEncryptor实例
public static TextEncryptor text(CharSequence password, CharSequence salt) {
return new HexEncodingTextEncryptor(standard(password, salt));
}
TextEncryptor使用标准的BytesEncryptor对文本数据进行加密,加密的结果作为十六进制编码的字符串返回,以便于在文件系统或数据库中存储。
2、使用Encryptors.queryableText()工厂方法可以创建一个 “queryable” 的TextEncryptor实例
@Deprecated
public static TextEncryptor queryableText(CharSequence password, CharSequence salt) {
return new HexEncodingTextEncryptor(new AesBytesEncryptor(password.toString(),salt));
}
与Encryptors.text()不同,Encryptors.queryableText()使用的是一个默认的初始化向量,因此加密相同的数据会得到相同的加密结果。
Key Generators
KeyGenerators类提供了许多方便的工厂方法,用于构造不同类型的Key Generator。 使用这个类可以创建一个BytesKeyGenerator来生成byte[]键,可以构造一个StringKeyGenerator来生成String键。 KeyGenerators是线程安全的。
Password Encoding
spring-security-crypto模块支持对密码进行编码。 PasswordEncoder是核心服务接口,具有如下签名方法:
public interface PasswordEncoder {
String encode(CharSequence rawPassword);//如果rawPassword编码后等于encodedPassword,则matches方法返回trueboolean matches(CharSequence rawPassword, String encodedPassword);default boolean upgradeEncoding(String encodedPassword) {
return false;}
}
1、BCryptPasswordEncoder使用 "bcrypt"方式进行散列密码加密,该方式已被广泛使用。Bcrypt使用一个随机的16 byte 的盐值,并且是一个 “deliberately slow” 算法,以防止密码破解。 它所做的工作量可以通过“strength”参数进行调整,该参数的值从4到31。 值越高,计算散列需要做的工作就越多,缺省值为10。 可以在部署的系统中更改该值,而不影响现有的密码,因为该值也存储在编码的散列中。
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
2、Pbkdf2PasswordEncoder使用 “PBKDF2 ” 方式进行散列密码加密。为了防止密码破解,PBKDF2是一种 "deliberately slow"算法,应该调整为用0.5秒来验证系统上的密码。
Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));
上一篇:SpringSecurity------Security相关的HTTP Response Headers(四)
下一篇:SpringSecurity------Security Expressions(六)