Jasypt使用
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*加密器以循环方式为请求提供服务,因此标准工件中同步代码导致的线程阻塞量将降至最低。
这些实现不会创建新线程,因此可以在不允许创建新线程的容器控制环境中安全地使用它们。
为特定应用程序和计算机推荐的池大小取决于许多因素,但大致等于计算机中的处理器/内核数量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署