前言
一般情况下,配置文件会包含数据库账号密码、业务的一些密钥等重要的敏感信息,如果这些信息泄露,会产生严重后果,因此对这些敏感信息加密是必不可少的。
Jasypt
这 是一个 java 库,它允许开发人员以最小的努力将基本的加密功能添加到他/她的项目中,而无需深入了解 密码学 的工作原理 ,官网如下:
其最核心的步骤就两个:
- 添加jasypt依赖
- 添加配置
Jasypt示例
构建 spring boot项目,该示例是基于springboot版2.7.3, jdk 17,jasypt版本是3.04
1.引入依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
2.配置文件
这是数据库账号密码的一个配置
spring.datasource.username= root
spring.datasource.password=root
现在需要对username和password进行加密,加密后的结果如下:
spring.datasource.username=ENC(eIOQM9aChGP4/CQk7RXAM7ZSK7AIBI9faeQb31M5/ouChpMIDHlB2+uSsIaZmxQU)
spring.datasource.password=ENC(Y+tFn7NIUjXhUjtyfpDmI7EfL9ORPiRKSKrnxU+3wfFcHUo9cl2/wv4uAlc56lng)
ENC()是jasypt的一个标识符
3.利用代码程序加密(写一个加密工具)
这是一个小demo,所有的项目都可以使用这个工具生成加密密码

核心代码如下:
package com.xm.demo.common.jasypt;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.iv.RandomIvGenerator;
import org.springframework.stereotype.Component;
@Component
public class Jasypt {
private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";
private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";
/**
* 加密
* @param str 加密的字符
* @param salt 密钥
* @return java .lang.String
*/
public String encryption(String str,String salt){
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword(salt);
encryptor.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
encryptor.setIvGenerator(new RandomIvGenerator());
return encryptor.encrypt(str);
}
/**
* 解密
* @param str 解密的字符
* @param salt 密钥
* @return java.lang.String
*/
public String decryption(String str, String salt){
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword(salt);
encryptor.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
encryptor.setIvGenerator(new RandomIvGenerator());
return encryptor.decrypt(str);
}
}
4.添加配置参数
jasypt.encryptor.password=demo
这个配置是必须的,但这里有个问题就是,把加密的密钥放到配置文件里,如果泄露了,别人还是可以解密的,因此需要把这个配置放到别的地方去,当然开发阶段把密钥放到配置中是没有问题的。
方式一: 直接作为程序启动时的命令行参数来带入
java -jar xxx.jar --jasypt.encryptor.password=demo
方式二: 直接作为程序启动时的应用 环境变量 来带入
java -Djasypt.encryptor.password=demo -jar xxx.jar
5.jasypt配置扩展
jasypt.encryptor.password=demo #加密密钥
jasypt.encryptor.algorithm=PBEWITHHMACSHA512ANDAES_256 #加密算法(默认)
jasypt.encryptor.property.prefix=ENC( #标识符
jasypt.encryptor.property.suffix=) #标识符
实际开发的流程是这样的:
运维提供加密后的信息和密钥,例如加密后的账号密码,然后开发人员只需要在 pom 文件中添加jaspyt依赖,以及配置文件中加上jasypt.encryptor.password=密钥(开发阶段)。项目上线了,运维会把密钥作为程序启动时的命令行参数来带入 。