当前位置: 代码迷 >> 综合 >> SpringSecurity------Spring Security Crypto(五)
  详细解决方案

SpringSecurity------Spring Security Crypto(五)

热度:21   发布时间:2023-12-20 23:15:09.0

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(六)

  相关解决方案