数据库密码直接明文写在配置中,对安全来说,是一个很大的挑战。一旦密码泄漏,将会带来很大的安全隐患。尤其在一些企业对安全性要求很高,因此我们就考虑如何对密码进行加密。本文着重介绍Jasypt对SpringBoot配置文件加密。
引入依赖:

         <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

生成密文:

 public static void main(String[] args) {
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        //加密所需的salt(盐)
        textEncryptor.setPassword("Bt%XJ^n1j8mz");
        //要加密的数据(数据库的用户名或密码)
        String username = textEncryptor.encrypt("toutou");
        String password = textEncryptor.encrypt("demo123456");
        System.out.println("username:"+username);
        System.out.println("password:"+password);
    }

将配置文件中数据库的密码替换成 ENC(密文):

# 加密所需的salt(盐)
#jasypt.encryptor.password=Bt%XJ^n1j8mz
# 默认加密方式PBEWithMD5AndDES,可以更改为PBEWithMD5AndTripleDES
#jasypt.encryptor.algorithm=PBEWithMD5AndDES
spring.datasource.username=ENC(d/qt1SXvttpkiugIzTYkxg==)
spring.datasource.password=ENC(rhT6VNpoRUkQYYOHAQ58V4/+fkj9CWfT)

盐也在配置文件中,现在做到了一眼看不出明文,但是拿到盐 再通过相同的算法还是可以解密的,毕竟算法都是依赖中的那一套。
为了解决这个问题,可以启动jar包的时候 再加参数 java -jar xxx.jar --jasypt.encryptor.password=Bt%XJ^n1j8mz
不过应该还可以通过其他方法获取jasypt.encryptor.password,例如actutor端点。