场景
项目中使用配置文件,需要对于如账号、密码等敏感信息需要加密处理.这里使用jasypt做配置文件的加解密
配置
pom.xml配置
pom.xml 如下配置,关于依赖包版本可以去http://unidal.org/nexus/#welcome查看最新下载
application.yml 配置
G0CvDz7oJn6 是参与加密的盐,可以根据需要修改
jasypt:
encryptor:
password: G0CvDz7oJn6
加密
至此,配置已经完成。下面需要对加密项加密
使用idea可以打开控制台。(或者cmd进如下目录也一样)
C:\apache-maven-3.5.4\repository\org\jasypt\jasypt\1.9.2 是你的本地maven仓库中下载的jasyop包路径。
切换到这个路径下执行命令
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password=G0CvDz7oJn6 algorithm=PBEWithMD5AndDES input=root
password:application.yml配置文件中配置的加密盐
algorithm:加密算法
input:待加密参数(如账号、密码等敏感信息)
加密完后会输出结果
----OUTPUT----------------------
100Ds4PorBmtQFXuzdOMiw==
把结果放进你的application配置文件相关加密项。注意需要使用ENV()括起来
问题
加密后盐也需要放在配置文件中,从安全的角度考虑有一定的风险。
方式一
把盐放在启动参数中
application.yml文件去掉如下配置
jasypt:
encryptor:
password: G0CvDz7oJn6
在idea中把配置放到启动参数中
1.在1处选择edit configurations
2.在2处填写启动参数 -Djasypt.encryptor.password=G0CvDz7oJn6
方式二
实现EncryptablePropertyDetector和EncryptablePropertyResolver接口
具体如下
public class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {
public static final String ENCODED_PASSWORD_HINT = "abc_"; //自定义的加入值
//判断是否为预定的值
@Override
public boolean isEncrypted(String s) {
if (null != s) {
return s.startsWith(ENCODED_PASSWORD_HINT);
}
return false;
}
//截取真正的加密串
@Override
public String unwrapEncryptedValue(String s) {
return s.substring(ENCODED_PASSWORD_HINT.length());
}
}
public class MyEncryptablePropertyResolver implements EncryptablePropertyResolver {
@Value("${credit.dataSource.key}")
private String dataKey;
@Override
public String resolvePropertyValue(String s) {
if (null != s && s.startsWith(MyEncryptablePropertyDetector.ENCODED_PASSWORD_HINT)) {
//对配置文件加密值进行解密。加密方式可以自定义
//楼主这里使用hutool包提供的AES加密,秘钥经过异或并base64写入配置文件
if (null != s && s.startsWith(MyEncryptablePropertyDetector.ENCODED_PASSWORD_HINT)) {
s = s.substring(MyEncryptablePropertyDetector.ENCODED_PASSWORD_HINT.length());
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue(),XOR.getKey(dataKey).getBytes()).getEncoded();
return SecureUtil.aes(key).decryptStr(s);
}
}
return s;
}
}
public class XOR {
public static String getKey(String dataKey){
if(StringUtils.isBlank(dataKey)){
return null;
}
String[] strs = Base64.decodeStr(dataKey).split(" ");
String result = "";
int current = 0;
for (String str:strs) {
current = Integer.parseInt(str);
current = current^0xff;
result+=current;
}
return result;
}
}
application.yml文件配置如下
spring:
datasource:
druid:
username: abc_785b82c1b61ea5e2a41b3
password: abc_da44989808608d99fd4d98
credit:
dataSource:
key: MjU0IDI1MyAy1IDI1NSAyNTUgMjU1IDI1NSAyNTUgMjU1IA==
启动类注入上面两个实现类
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication .class, args);
}
@Bean(name = "encryptablePropertyDetector")
public EncryptablePropertyDetector encryptablePropertyDetector() {
return new MyEncryptablePropertyDetector();
}
@Bean(name = "encryptablePropertyResolver")
public EncryptablePropertyResolver encryptablePropertyResolver() {
return new MyEncryptablePropertyResolver();
}
}