跳到主要内容
版本:7.0.2

Spring Security 加密模块

DeepSeek V3 中英对照 Cryptography Spring Security Crypto Module

Spring Security Crypto 模块提供了对对称加密、密钥生成和密码编码的支持。该代码作为核心模块的一部分分发,但不依赖于任何其他 Spring Security(或 Spring)代码。

加密器

Encryptors 类提供了用于构建对称加密器的工厂方法。该类允许您创建 BytesEncryptor 实例,以加密原始 byte[] 形式的数据。您也可以构建 TextEncryptor 实例来加密文本字符串。加密器是线程安全的。

备注

BytesEncryptorTextEncryptor 都是接口。BytesEncryptor 有多个实现。

BytesEncryptor

你可以使用 Encryptors.stronger 工厂方法来构建一个 BytesEncryptor

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

stronger加密方法通过使用256位AES加密与伽罗瓦计数器模式(GCM)创建加密器。它采用PKCS #5的PBKDF2(基于密码的密钥派生函数#2)来派生密钥。此方法需要Java 6环境。用于生成SecretKey的密码应保存在安全位置且不应共享。盐值用于在加密数据泄露时防止针对密钥的字典攻击。同时应用16字节随机初始化向量,确保每条加密消息的唯一性。

所提供的盐值应为十六进制编码的字符串形式,需具备随机性,且长度至少为 8 字节。您可以使用 KeyGenerator 来生成此类盐值:

String salt = KeyGenerators.string().generateKey(); // generates a random 8-byte salt that is then hex-encoded

您也可以使用 standard 加密方法,即采用密码块链接(CBC)模式的 256 位 AES 加密。该模式不具备认证加密功能,无法保证数据的真实性。如需更安全的替代方案,请使用 Encryptors.stronger

文本加密器

您可以使用 Encryptors.text 工厂方法来构建一个标准的 TextEncryptor:

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

TextEncryptor 使用标准的 BytesEncryptor 来加密文本数据。加密结果以十六进制编码的字符串形式返回,便于在文件系统或数据库中存储。

密钥生成器

KeyGenerators 类提供了多种便捷的工厂方法,用于构建不同类型的密钥生成器。通过使用该类,你可以创建一个 BytesKeyGenerator 来生成 byte[] 类型的密钥。你也可以构建一个 StringKeyGenerator 来生成字符串密钥。KeyGenerators 是一个线程安全的类。

BytesKeyGenerator

您可以使用 KeyGenerators.secureRandom 工厂方法来生成一个由 SecureRandom 实例支持的 BytesKeyGenerator

BytesKeyGenerator generator = KeyGenerators.secureRandom();
byte[] key = generator.generateKey();

默认密钥长度为8字节。KeyGenerators.secureRandom 的变体提供了对密钥长度的控制:

KeyGenerators.secureRandom(16);

使用 KeyGenerators.shared 工厂方法构建一个 BytesKeyGenerator,该生成器在每次调用时始终返回相同的密钥:

KeyGenerators.shared(16);

StringKeyGenerator

你可以使用 KeyGenerators.string 工厂方法来构建一个8字节、基于 SecureRandomKeyGenerator,它会将每个密钥以十六进制编码为 String 类型:

KeyGenerators.string();

密码编码

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 相等时返回 true。此方法旨在支持基于密码的身份验证方案。

BCryptPasswordEncoder 实现使用广泛支持的 "bcrypt" 算法对密码进行哈希处理。Bcrypt 使用一个随机的 16 字节盐值,并且是一种故意设计得较慢的算法,以阻碍密码破解者。您可以通过 strength 参数来调整其工作量,该参数接受一个从 4 到 31 的值。值越高,计算哈希所需的工作量就越大。默认值为 10。您可以在已部署的系统中更改此值,而不会影响现有密码,因为该值也存储在编码后的哈希中。以下示例使用了 BCryptPasswordEncoder

// Create an encoder with strength 16
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));

Pbkdf2PasswordEncoder 实现使用 PBKDF2 算法对密码进行哈希处理。为了抵御密码破解,PBKDF2 是一种故意设计为缓慢的算法,应调整其参数,使其在您的系统上验证密码大约需要 0.5 秒。以下系统使用了 Pbkdf2PasswordEncoder

// Create an encoder with all the defaults
Pbkdf2PasswordEncoder encoder = Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8();
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));