Jasypt自定义密码加解密算法
2020-09-19Jasypt是什么就不用我科普了吧?Jasypt常和Spring Boot/Spring Cloud搭配,用来对应用配置文件中的密码、密钥等敏感信息进行加密存储。
言归正传,我们最近基于Spring Boot开发了一个Web应用,不过因为合规要求,某些配置信息需要使用加密机进行硬件加解密。但是Jasypt默认只支持对称加密和非对称加密两种算法,如果使用其他加解密方式,需要自己进行扩展实现。可是我在网上溜了小半天,发现网上的教程都是教你怎么把Jasypt和Spring Boot框架进行整合的,我的需求并没能找到相应的解决方案。所以我只能自己读Jasypt的源码分析了。
一、Jasypt的工作过程
通过对Jasypt的源码进行阅读,发现Jasypt的工作过程很简单。大概流程是这样子的:
1)事先通过将需要加密的参数使用加密工具得到的密文写入配置文件,并在配置文件中使用ENC()“函数”(本质就是一个标记特征字符)进行标记;
2)应用启动的时候传入解密密钥(对称加密算法的密码、非对称加密算法的私钥),然后应用在读取配置参数键值的时候,如果发现键值中含有ENC标记,就将“ENC()”中的内容抽取出来,然后调用加解密接口(org.jasypt.encryption.StringEncryptor)的实现类进行解密,从而得到明文。加密操作同理。对于我的需求,实现起来并不难,就是重写加解密接口StringEncryptor的实现类,然后把bean注册给Jasypt。
二、解决方案
1、自己实现一个StringEncryptor接口的实现类:
@Component("customStringEncryptor")
public class CustomStringEncryptor implements StringEncryptor {
private static final Logger logger = LoggerFactory.getLogger(CustomStringEncryptor.class);
@Autowired
private KeyManager keyManager;
@Override
public String encrypt(final String message) {
final String exMsg = String.format("encrypt method is not implemented, original message: '%s'.", message);
logger.error(exMsg);
throw new UnsupportedOperationException(exMsg);
}
@Override
public String decrypt(final String encryptedMessage) {
String decryptedMessage = null;
try {
decryptedMessage = keyManager.decrypt(encryptedMessage);
} catch (ScmException e) {
logger.error("decrypt failed, key: '{}'.", encryptedMessage, e);
throw new RuntimeException(e);
}
return decryptedMessage;
}
}
2、在application.yml加入如下配置:
jasypt:
encryptor:
bean: customStringEncryptor
至此,搞定。

重点是 KeyManager 吧?不贴一下代码吗?