spring设置配置文件中密码敏感信息加密

原由:

提示:最近,公司内部开始项目安全方面的整改,其中有写老项目是SSM的,其中数据库的一些配置信息直接写在config.properties文件里面,还是明文,所以需要将密码改成加密后的字符串,话不多说,直接上方案。

加密解密的方法我就不写了,网上很多工具类

方法一:PropertyPlaceholderConfigurer

提示:PropertyPlaceholderConfigurer是spring中用来读取配置文件信息中的类

  • 配置文件config.properties
jdbc.url=jdbc:mysql:/127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
# 加密后的数据库密码
jdbc.password=4220c1f30cdbf9c54dd5ccd5d71857bc1111   
  • java实现PropertyPlaceholderConfigurer
public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
    public EncryptPropertyPlaceholderConfigurer() {
    }
    @Override
    protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props) throws BeansException {
        try {
            String password = props.getProperty("jdbc.password");
            if (password != null) {
                // 将加密的password解密后塞到props, 加密解密方法是我自定义的
                String decrypt = Cryptos.aesDecrypt(password);
                logger.info("password:" + decrypt);
                props.setProperty("jdbc.password", decrypt);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.processProperties(beanFactory, props);
    }
}
  • 配置文件指定EncryptPropertyPlaceholderConfigurer
     <!--class填写刚才那段代码的类路径-->
    <bean
          class="com.**********.EncryptPropertyPlaceholderConfigurer">
        <property name="location">
            <value>classpath:config.properties</value>
        </property>
    </bean>

  • 结论:
    这个方案在大部分项目里面是可以,而且网上这个解决方案也是主流吗,但公司有个项目不行,只能使用方案二。

方法二:DruidPasswordCallback

提示:公司有个比较来就的项目,spring用的还是4.3版本的,用方法已发现不行,方法一中props.setProperty执行了,但是DruidAbstractDataSource读取的数据库密码还是加密过后的字符串

在这里插入图片描述

  • 配置文件config.properties
jdbc.url=jdbc:mysql:/127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
# 加密后的数据库密码
jdbc.password=4220c1f30cdbf9c54dd5ccd5d71857bc1111   
  • java实现DruidPasswordCallback
public class DBPasswordCallback extends DruidPasswordCallback {
    @Override
    public void setProperties(Properties properties) {
        super.setProperties(properties);
        //获取配置文件中加密后的密码,和xml中的connectionProperties属性配置相关
        String password = (String) properties.get("password");
        try {
            //解密过程,自定义解密方法
            String dbpassword=  Cryptos.aesDecrypt(password);
            //设置密码
            setPassword(dbpassword.toCharArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 配置文件指定EncryptPropertyPlaceholderConfigurer
 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
        <property name="driverClassName" value="${jdbc.driver}"/>

        <!-- 基本属性 url、user、password -->
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="${jdbc.pool.init}"/>
        <property name="minIdle" value="${jdbc.pool.minIdle}"/>
        <property name="maxActive" value="${jdbc.pool.maxActive}"/>

        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000"/>

        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>

        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000"/>

        <!-- 超过时间限制是否回收 -->
        <property name="removeAbandoned" value="true"/>
        <!-- 超时时间;单位为秒。180秒=3分钟 -->
        <property name="removeAbandonedTimeout" value="1200"/>
        <!-- 关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="true"/>


        <property name="validationQuery" value="${jdbc.testSql}"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>

        <!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)
        <property name="poolPreparedStatements" value="true" />
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> -->

        <!-- 配置监控统计拦截的filters -->
        <property name="filters" value="stat"/>

       <!-- 这里是重点 -->
        <property name="connectionProperties" value="password=${jdbc.password}"/>
        <property name="passwordCallback" ref="dbPasswordCallback"/>

    </bean>
    <!-- 自定义的设置数据库密码类 -->
    <bean id = "dbPasswordCallback" class="com.*******.DBPasswordCallback"/>

小结

spring版本的不同,也影响了解决方案。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring,可以使用Java Cryptography Architecture(JCA)提供的加密API来对敏感信息进行加密Spring还提供了一些加密工具类来帮助我们在应用程序加密和解密数据。 下面是一个简单的示例,演示如何使用Spring加密库对属性文件密码进行加密: 首先,需要在pom.xml文件添加Spring Security Crypto库的依赖: ``` <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-crypto</artifactId> <version>${spring.version}</version> </dependency> ``` 然后,在Spring应用程序的配置文件,可以使用`StandardPBEStringEncryptor`类来加密和解密属性值。下面是一个例子: ```xml <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:config.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true"/> </bean> <bean id="encryptor" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer"> <constructor-arg ref="propertyConfigurer"/> <property name="encryptor"> <bean class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"> <property name="algorithm" value="PBEWithMD5AndDES"/> <property name="password" value="mySecretPassword"/> </bean> </property> </bean> ``` 在上面的配置,`StandardPBEStringEncryptor`类使用“PBEWithMD5AndDES”算法对属性文件的值进行加密,并使用“mySecretPassword”作为密钥。在应用程序,可以使用以下方法来获取已加密的属性值: ```java String password = encryptor.encrypt("myPassword"); ``` 同样,可以使用以下方法来解密属性值: ```java String plainTextPassword = encryptor.decrypt(password); ``` 使用Spring Security Crypto库对敏感信息进行加密可以帮助保护应用程序敏感数据,确保只有授权的用户可以访问它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值