springboot项⽬使⽤jasypt实现⾃定义配置⽂件内容加密
场景
项⽬中使⽤配置⽂件,需要对于如账号、密码等敏感信息需要加密处理.这⾥使⽤jasypt做配置⽂件的加解密
配置
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
l配置⽂件中配置的加密盐
algorithm:加密算法
input:待加密参数(如账号、密码等敏感信息)
加密完后会输出结果
----OUTPUT----------------------
100Ds4PorBmtQFXuzdOMiw==
把结果放进你的application配置⽂件相关加密项。注意需要使⽤ENV()括起来
springboot推荐算法
问题
加密后盐也需要放在配置⽂件中,从安全的⾓度考虑有⼀定的风险。
⽅式⼀
把盐放在启动参数中
jasypt:
encryptor:
password: G0CvDz7oJn6
在idea中把配置放到启动参数中
1.在1处选择edit configurations
2.在2处填写启动参数 -ptor.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 = ateKey(Value(),Key(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;
}
}
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();
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。