Jasypt使用

发布时间 2023-06-02 22:26:05作者: shigp1

Digesters

Digester是专门从输入中创建消息摘要(也称为哈希)的类。

消息摘要是摘要(或散列)函数的结果,它们是单向的,也就是说,从消息摘要开始,无法重建原始消息。

正因为如此,消息摘要对于密码加密来说就足够了。事实上,在一些国家,以未加密的方式存储用户密码是非法的,甚至以可逆(双向)的方式加密也是非法的。

jasypt中的digester位于org.asypt.digest包中,该包由以下接口组成:

  • ByteDigester,用于从字节数组输入创建摘要。

  • StringDigester,用于从字符串输入创建摘要。

以及以下标准实现:

  • StandardByteDigester:非常可配置和极其安全的ByteDigester实现,按照PKCS#5:基于密码的加密标准中给出的指令实现。

  • StandardStringDigester:与StandardByteDigester相对应的字符串,接收字符串输入并返回字符集安全、BASE64(或十六进制)编码的字符串输出。

其相应的基于池的实现用于多处理器/多核系统中的高性能:

  • PooledByteDigester:与StandardByteDidgester相同的API,但实际上包含了这些对象的池,这些对象用于在循环中提供摘要/检查请求。

  • PooledStringDigester:与StandardStringDidgester相同的API,但事实上包含了这些对象的池,这些对象用于在循环中提供摘要/检查请求。

使用它们可以非常简单:

StandardStringDigester digester = new StandardStringDigester();
digester.setAlgorithm("SHA-1");   // optionally set the algorithm
digester.setIterations(50000);  // increase security by performing 50000 hashing iterations
...
String digest = digester.digest(myMessage);

这些摘要,包括标准摘要和池化摘要,实现了一组一致且安全的默认配置值,但它们可以通过两种方式进行额外配置:

  • 通过调用其setX(…)方法(算法、提供者、盐大小等)

  • 通过设置配置摘要的DigesterConfig对象。提供了该接口的默认bean实现(SimpleDigesterConfig),但用户可以创建自己的bean实现,以便能够以他/她需要的任何方式检索配置参数。

池式摘要与非池式标准摘要具有完全相同的API,因此它们可以互换使用,但需要添加一个新的配置方法,称为setPoolSize(),该方法可以确定它们内部容纳的标准摘要池数量。

PooledStringDigester digester = new PooledStringDigester();
digester.setPoolSize(4);          // This would be a good value for a 4-core system 
digester.setAlgorithm("SHA-1");
digester.setIterations(50000);
...
String digest = digester.digest(myMessage);

这些池对象将使用其内部的Standard*摘要以循环方式为请求提供服务,因此标准工件中同步代码导致的线程阻塞量将降至最低。

这些实现不会创建新线程,因此可以在不允许创建新线程的容器控制环境中安全地使用它们。

为特定应用程序和计算机推荐的池大小取决于许多因素,但大致等于计算机中的处理器/内核数量。

Encryptors

加密程序是专门用于执行双向加密操作的类。也就是说,它们既可以加密普通数据,也可以解密加密数据。

jasypt中用于加密的相关接口位于org.asypt.encryption包中,它们是:

  • ByteEncryptor用于字节数组加密和解密的。

  • StringEncryptor用于对字符串进行加密和解密的。

  • BigIntegerEncryptor用于对BigIntegers进行加密和解密。

  • BigDecimalEncryptor用于对BigDecimals进行加密和解密。

Jaypt提供了一种加密类型的实现:基于密码的加密(PBE)。

Password-Based Encryption (PBE)

基于密码的加密是通过从用户提供的密码生成加密密钥,并向加密算法提供输入和生成的密钥来执行的。密钥通常是通过对密码应用一些散列函数来获得的。

因此,jasypt中的所有PBE加密器在用于加密或解密操作之前都需要设置密码。

jasypt中PBE的相关接口位于org.jsypt.encryption.PBE包中,它们是:

  • PBEByteEncryptor用于基于密码的字节数组加密和解密。

  • PBEStringEncryptor用于基于密码的字符串加密和解密。

  • PBEBigIntegerEncryptor用于BigIntegers的基于密码的加密和解密。

  • PBEBigDecimalEncryptor用于基于密码的BigDecimals加密和解密。

以及以下标准实现:

  • StandardPBEByteEncryptor:PBEByteEncryptor的非常可配置和非常安全的实现,按照PKCS#5:基于密码的加密标准中给出的指令实现。

  • StandardPBEStringEncryptor:与StandardPBEByteEncryptor相对应的字符串,接收字符串输入并返回字符集安全、BASE64(或十六进制)编码的字符串输出作为加密结果。

  • StandardPBEBigIntegerEncryptor:相当于StandardPBEByteEncryptor,接收BigInteger输入并返回BigInteger输出。

  • StandardPBEBigDecimalEncryptor:等效于StandardPBEByteEncryptor,接收BigDecimal输入并返回BigDecimals输出。

及其相应的基于池的实现,以在多处理器/多核系统中实现高性能:

  • PooledPBEByteEncryptor:与StandardPBEByte Encrypter相同的API,但实际上包含了这些对象的池,这些对象用于为往返的加密/解密请求提供服务。

  • PooledPBEStringEncryptor:与StandardPBEString Encrypter相同的API,但实际上包含这些对象的池,这些对象用于在循环中服务加密/解密请求。

  • PooledPBEBigIntegerEncryptor:与StandardPBEBigIntegerEncryptor相同的API,但事实上包含这些对象的池,这些对象用于提供往返的加密/解密请求。

  • PooledPBEBigDecimalEncryptor:与StandardPBEBigDecimalEncryptor的API相同,但实际上包含了这些对象的池,这些对象用于在循环中提供加密/解密请求。

例子:

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("jasypt");                         // we HAVE TO set a password
encryptor.setAlgorithm("PBEWithHMACSHA512AndAES_256");   // optionally set the algorithm
encryptor.setIvGenerator(new RandomIvGenerator());       // for PBE-AES-based algorithms, the IV generator is MANDATORY
...
String encryptedText = encryptor.encrypt(myText);
...
String plainText = encryptor.decrypt(encryptedText);  // myText.equals(plainText)

与摘要一样,标准*加密器实现了一组一致且安全的默认配置值(密码除外),但它们也可以通过两种方式进行额外配置:

  • 通过调用其setX(…)方法(算法、提供者、密码、salt、IV等)

  • 通过设置配置摘要的PBEConfig对象。提供了该接口的默认bean实现(SimplePBEConfig),但用户可以创建自己的bean实现,以便能够以他/她需要的任何方式检索配置参数(例如,从远程服务器检索密码)。

池式加密机与非池式标准加密机具有完全相同的API,因此它们可以互换使用,但添加了一个新的必需配置方法,称为setPoolSize(),该方法确定了它们将在内部保存的标准加密机数量。

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setPoolSize(4);          // This would be a good value for a 4-core system
encryptor.setPassword("jasypt");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");
...
String encryptedText = encryptor.encrypt(myText);

这些池对象将使用其内部的Standard*加密器以循环方式为请求提供服务,因此标准工件中同步代码导致的线程阻塞量将降至最低。

这些实现不会创建新线程,因此可以在不允许创建新线程的容器控制环境中安全地使用它们。

为特定应用程序和计算机推荐的池大小取决于许多因素,但大致等于计算机中的处理器/内核数量。