SpringBoot使用jaspyt对配置文件加密

1、需求

对于一些配置文件里的敏感信息,如数据库密码、部分对接的账号密码之类的数据,进行加密存储。不让密码明文暴露在配置文件中。

2、springboot项目集成 jasypt的三种使用方式

MD5密码加密,非对称RSA公钥加密私钥解密,自定义算法加解密

2.1、引入相关依赖

<dependency>

    <groupId>com.github.ulisesbocchio</groupId>

    <artifactId>jasypt-spring-boot-starter</artifactId>

    <version>3.0.3</version>

</dependency>

2.2、是否需要在启动类添加注解

一般springboot项目的启动类都有@SpringBootApplication 所以也包含了@EnableAutoConfiguration

所以使用jasypt只需要引入依赖,然后在配置文件中配置加密的密码,即可以在项目启动时对密文进行解密。

详情看官方文档  https://github.com/ulisesbocchio/jasypt-spring-boot/blob/master/README.md

2.3、配置文件配置加密密码

jasypt:
  encryptor:
    password: abcqwe
    algorithm: PBEWithMD5AndDES
    

2.4、生成密文示例代码

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

生成代码后,替换掉配置文件的明文数据,用ENC(newpassword)的形式即可。

当然也不一定是用ENC()包裹密文,可以自定义前缀后缀,例如:

    password: ENC(jdiakjd3wq89awdak13joiawdqwji)

这种是最简单的,安全性也是最低的,拿到配置文件和加密密码后调用textEncryptor.decrypt就可以解密得到明文密码。

所以一般使用这个的话会把密码设置到启动参数。不过也是感觉不太好用,稍微升级一下的话就用非对称加密。

2.5、非对称加密

配置文件改成

jasypt:
  encryptor:
    privateKeyFormat: PEM
    privateKeyString: asidjqkwjoikqjojwqopdjqopjwdpoqkpoldkqwpoeikpqowieopqiwepoqiwpoe

默认是用公钥加密,然后配置的私钥解密,所以对应的密文就需要用公钥加密后存储。

这种方式比MD5的好一点,也差不多,也是公开的算法加密。

2.6、 自定义加密类

修改配置文件,配置好加解密的算法实现类

jasypt:
  encryptor:
    bean: customStringEncryptor

然后创建一个bean customStringEncryptor实现StringEncryptor接口,重写加解密方法

比如简单的在密文后加111,然后解密就把最后的111去掉,实际使用就随意发挥了,可以多重加密解密

import org.jasypt.encryption.StringEncryptor;
import org.springframework.stereotype.Component;

/**
 * @author : itmamba
 * @version 1.0
 * @date : 2021/6/10  21:59
 */
@Component("customStringEncryptor")
public class CustomStringEncryptor implements StringEncryptor {

    @Override
    public String encrypt(final String message) {
        return message+"111";
    }

    @Override
    public String decrypt(final String encryptedMessage) {
        return encryptedMessage.substring(0,encryptedMessage.indexOf("111"));
    }

}

3、jasypt 实现原理以及源码浅读分析

源码地址:https://github.com/ulisesbocchio/jasypt-spring-boot

集成jasypt后启动项目首先可以看到一个Converter转换器 EncryptablePropertySourceConverter

这个作用就是 将environment的PropertySource转换成EncryptablePropertySource

这样就可以对配置文件中的密文进行解密

这个工具组件有四个比较关键的类可以自定义使用:Filter、Resolver、Detector、StringEncryptor

上述用到的自定义加解密算法就是实现StringEncryptor接口。其他的需要自定义前后缀之类的可以参考官方文档使用。

不自定义实现的话也会默认加载一些 lazy 开头的实现类。例如 lazyEncryptablePropertyFilter、lazyEncryptablePropertyDetector等。

lazyEncryptablePropertyDetector 作用就是过滤出需要解密的配置,然后去掉前后缀,再进行解密。

例如redis和datasource设置连接属性时就是在JavaBeanBinder的bind方法里,对RedisProperties 和 DatasourceProperties setValue时,设置了解密后的明文。

 

4、注意事项及常见问题

注意事项:使用时最好对比下版本,不同的springboot版本使用合适的jasypt版本。

遇到问题:项目启动正常,但是进行数据库访问时报异常。

原因:Hikari 连接池在springboot2.1.5前有默认创建连接,之后好像是没有的,可以关注启动时的日志,看启动时有没打印hikari starting

 

 

即兴记录部分,接入项目还有问题未解决...

解决完再详细续写...

未完待续....

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章