前言
记载一次springboot 框架数据库密码加密过程
一、jasypt 自定义加密算法
近期遇到一个项目,要求的安全性较高,需要将springboot项目中的数据库密码加密。本来一个简单的任务,整整用了我半天时间,还是太年轻。
项目本来用的jasypt默认的加密方式,但需求方认为安全性不够,好吧,改!没做过怎么办,百度,不知道咋想的,竟然没有继续使用jasypt的加密方式,改用了druid,有费了大量的时间,不过有收获,也不亏。
下面还是先记录下jasypt的加密方式:
1、引入依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
2、在application.yml文件中加入配置文件
#数据库配置文件加密
jasypt:
encryptor:
## 实现jasypt加密解密的类
## 这里的类是自己定义的加密算法的类需要继承StringEncryptor类
bean: desencrypt
3、密码经过自定义的加密算法后,放到ENC中,解析是会根据ENC查找对应的密码
url: jdbc:mysql://localhost:3306/unionpay_project?serverTimezone=UTC
username: root
password: ENC(4yXsSiLdzGU=)
4、加密与解密的类
@Component("desencrypt")
public class DESEncrypt implements StringEncryptor {
private String secret = "qfysvf4a453402314a0445d4f4c76ba49311cea";
@Override
public String encrypt(String s) {
try {
byte[] decrypt = EncryptUtil.encrypt(s.getBytes(), s);
return new String(decrypt);
} catch (Exception e) {
e.printStackTrace();
return s;
}
}
@Override
public String decrypt(String encrypted) {
try {
byte[] encrypt = EncryptUtil.decrypt(encrypted, secret);
return new String(encrypt);
} catch (Exception e) {
e.printStackTrace();
return encrypted;
}
}
}
二、Druid 加密方法
1.引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
2.自定义方法注入
我看网上许多的通过通过配置文件的方式进行加密类的注入,但是我尝试过许多次都失败了,不知道哪里的问题,只好改变方式。在一个配置类中通过代码的方式注入。(一定要注意导入的druid版本号)
@Bean("dataSource")
@ConfigurationProperties("spring.datasource.druid")
public DruidDataSource initDataSource() {
DruidDataSource build = DruidDataSourceBuilder.create().build();
//dbPasswordCallback 为自定义的解密方法类
build.setPasswordCallback(dbPasswordCallback);
return build;
}
自定义解密类:
@Component
@Slf4j
public class DbPasswordCallback extends DruidPasswordCallback {
@Value("4a453402314a01f4c76ba49311cea")
private String secretKey;
@Value("${spring.datasource.password}")
private String password;
@Override
public void setProperties(Properties properties) {
if (StringUtils.isNotEmpty(password) && StringUtils.isNotEmpty(secretKey)) {
try {
//密码解密
byte[] decrypt = EncryptUtil.decrypt(password, secretKey);
setPassword(new String(decrypt).toCharArray());
} catch (Exception e) {
setPassword(password.toCharArray());
}
}
}
}
总结
项目密码加密在开发中还是经常使用,这里记录一次免得以后忘记。以后还要多多努力。