在我们的开发中不可避免的需要使用到一些密码(数据库、redis等),开发和测试环境还好,但生产如果采用明文配置讲会有安全问题。
实现配置的脱敏我使用了Java
的一个加解密工具Jasypt
,它提供了单密钥对称加密
和非对称加密
两种脱敏方式。
单密钥对称加密:一个密钥加盐,可以同时用作内容的加密和解密依据;
非对称加密:使用公钥和私钥两个密钥,才可以对内容加密和解密;
以上两种加密方式使用都非常简单,咱们以springboot
集成单密钥对称加密方式做示例。
首先引入jasypt-spring-boot-starter
jar
com.github.ulisesbocchiojasypt-spring-boot-starter3.0.4
1、配置文件加入秘钥配置项jasypt.encryptor.password,并将需要脱敏的value值替换成预先经过加密的内容ENC(mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l)。
将密文账号密码复制出来解密看看是否正确
在项目中怎么使用了?
ENC()
这个格式我们是可以随意定义的,比如想要abc[mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l]
格式,只要配置前缀和后缀即可。
jasypt:encryptor:password: www.cc.sunni.ccproperty:prefix: "abc["suffix: "]"
ENC(XXX)格式主要为了便于识别该值是否需要解密,如不按照该格式配置,在加载配置项的时候jasypt
将保持原值,不进行解密。
系统在读取配置文件的时候会自动解密, 所以我们按以前的使用方法正常使用就行
秘钥是个安全性要求比较高的属性,所以一般不建议直接放在项目内,可以通过启动时-D
参数注入,或者放在配置中心,避免泄露,或者可以将根密钥在Main方法中设置。
java -jar -Djasypt.encryptor.password=www.sunni.cc pmsplatform.jar
public static void main(String[] args) {System.setProperty("jasypt.encryptor.password", Constants.JASYPT_ENCRYPTOR_PASSWORD);SpringApplication.run(Application.class, args);}