引言
最近公司给银行做了一个项目,在进行本地化部署的时候,银行的科技部门对我们的源码进行了安全扫描,在检测报告中有这么一个问题,要求我们的数据库密码不能以明文的 形式出现在配置文件中,所以小编需要解决这个问题,但是第一个想法就是,自己重写一个配置文件加载的那个方法,这样我们就可以在拿到密文以后,首先解密然后在使用。
但是查询了一些资料以后发现,这个问题已经有成熟的解决方案了,就是利用jasypt与spring结合轻松解决这个问题。
1、首先在项目中pom.xml文件中加入jasypt相关依赖包
<dependency> <groupId>org.jasypt</groupId> <artifactId>jasypt</artifactId> <version>1.9.2</version>
2、在spring的xml文件中增加配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--基于环境变量,配置加密机--> <bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"> <property name="algorithm" value="PBEWithMD5AndDES"/> <property name="password" value="xxxxx"/> </bean> <!--配置加密器,将用于解密--> <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"> <property name="config" ref="environmentVariablesConfiguration"/> </bean> <!-- 配置文件 --> <bean id="placeholderConfig" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer"> <constructor-arg ref="configurationEncryptor"/> <property name="locations"> <list> <value>classpath*:properties/*.properties</value> </list> </property> </bean> <context:annotation-config/> <aop:aspectj-autoproxy/> <context:component-scan base-package="com.jack.common.junit"/> <context:component-scan base-package="com.jack.common.db"/> <context:component-scan base-package="com.jack.common.redis"/> <context:component-scan base-package="com.jack.common.task"/> <context:component-scan base-package="com.jack.common.jcs"/> <context:component-scan base-package="com.jack.common.utils"/> <context:component-scan base-package="com.jack.xx.*.service"/> </beans>
在上面的xml文件中需要我们注意的是,增加了两个节点 配置加密机和解密机, 修个另一节点,就是我们加载.properties文件的节点,不再使用spring的加载器了,而是采用了org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer这个加载器。
其中配置加密节点中的两个属性 algorithm 指定了我们在加密的时候采用的加密算法 passwor 指定了我们在加密的时候的秘钥。
3、配置propertis文件
db.bid.url.W=jdbc:mysql://127.0.0.1:3301/xxxx?useUnicode=true&allowMultiQueries=true&characterEncoding=utf-8&useSSL=false db.bid.username.R1=root db.bid.password.R1=ENC(82BfssmmyW8c7RjX/p/mev1h6Tlja/0V)
这样我们在配置 文件中就可以采用密文的方式进行配置,这里值得注意的是 ENC(密文)这是jasypt规定的写法。下面会介绍怎么生成密文。
4、生成密文
通过 在pom文件中配置jasypt的jar包引用,我们已经将该jar包下载到我们本地了,我们将该jar包复制到其他的一个路径下面。 通过cmd命令行,进入到这个路径然后执行下面 命令获得密文。
加密:
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="xxxxxx" password=MINSHENGBANK algorithm=PBEWithMD5AndDES
解密:
解密: java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="2D3Bdy/ezCDJY+P6gl9uGEyAeAT3ytpR" password=ZHONGYUANBANK algorithm=PBEWithMD5AndDES
nput:你需要加密的明文字符串
password:加密秘钥 要和上面的配置一致
algorithm:加密算法 要和上面的配置一致
加密算法(PBEWITHHMACSHA1ANDAES_128, PBEWITHHMACSHA1ANDAES_256, PBEWITHHMACSHA224ANDAES_128, PBEWITHHMACSHA224ANDAES_256, PBEWITHHMACSHA256ANDAES_128, PBEWITHHMACSHA256ANDAES_256, PBEWITHHMACSHA384ANDAES_128, PBEWITHHMACSHA384ANDAES_256, PBEWITHHMACSHA512ANDAES_128, PBEWITHHMACSHA512ANDAES_256, PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_128, PBEWITHSHA1ANDRC2_40, PBEWITHSHA1ANDRC4_128, PBEWITHSHA1ANDRC4_40)选一种自己喜欢的吧,我这里选了PBEWithMD5AndDES
理论上看到这里 就可以实现我么的需求了,但是关于秘钥的配置我们还是需要强调一下他的安全性。下面介绍一下口令的三种配置方式。
1.配置本地环境变量的方式 这种方式比较安全
<!-- 基于环境变量,配置加密机 --> <bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"> <property name="algorithm" value="PBEWithMD5AndDES" /> <property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" /> </bean>
passwordEnvName的值直接设置为环境变量,比如value="APP_ENCRYPTION_PASSWORD", APP_ENCRYPTION_PASSWORD则是系统环境变量,具体使用步骤如:配置环境变量APP_ENCRYPTION_PASSWORD--> 启动应用程序 --> 应用程序启动完成 --> 删除环境变量APP_ENCRYPTION_PASSWORD(window和Linux配置不一样,建议搜索一下怎么配,比较简单,这里就不多说了)
2.直接配置方式
<!-- 基于环境变量,配置加密机 --> <bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"> <property name="algorithm" value="PBEWithMD5AndDES" /> <property name="password" value="haha" /> </bean>
3.properties文件方式
<!-- 基于环境变量,配置加密机 --> <bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"> <property name="algorithm" value="PBEWithMD5AndDES" /> <property name="passwordSysPropertyName" value="${kouling.haha}" /> </bean>
大家根据自己的需求选择一种方式进行配置即可。如果各位读者采用的是springboot的框架,那么配置就更加简单了。