SpringBoot配置文件数据库密码加密

引言

需求:springboot的配置文件中,把连接数据库的密码加密,使之不是以明文存储

步骤

  1. 导入Maven坐标
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
  1. 在springboot配置文件中配置(如application.properties中)
	# jasypt加密秘钥,该秘钥可以自定义
   jasypt.encryptor.password = maple@2020
  1. 建一个测试类来生成密码加密后的密文
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestDemo {
    @Autowired
    StringEncryptor stringEncryptor;//密码解码器自动注入

    @Test
    public void test() {
        System.out.println(stringEncryptor.encrypt("123456"));
    }
}

输出(注意每次输出不一定一样):caCSoLhToaPqpquknipDOg==
该步骤也可以用命令:

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=明文密码 password=加密秘钥 algorithm=PBEWithMD5AndDES

注意替换明文密码和加密秘钥!
但是该命令要在Maven库中该jar包所在目录下打开命令窗口执行(例D:\Maven_repository\org\jasypt\jasypt\1.9.2),不然容易报错:找不到或无法加载主类:xxx
4. 把配置文件中的值替换即可,如:

spring.datasource.password=ENC(caCSoLhToaPqpquknipDOg==)

如此则密码以密文保存在配置文件中!(使用@SpringBootApplication注解情况下springboot自动读取配置)
如果自己要读取属性配置则需要在读取配置类中注入解码类,例:

@Configuration
public class DatabaseConfig {
    @Autowired
    StringEncryptor encryptor;
    
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    
    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String pswd;

	//...

附:

  1. 如果报错:java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/bind/PlaceholdersResolver
    是使用2.1.0版本的jasypt-spring-boot-starter的原因,换成2.0.0即可
  2. 参考博文:
    spring boot升级问题
    spring、spring-boot配置文件属性内容加解密
    SpringBoot配置文件敏感信息加密,springboot配置文件数据库密码加密jasypt

你可能感兴趣的:(Java,spring,boot,密码加密)