zoukankan      html  css  js  c++  java
  • 使用Jasypt对SpringBoot配置文件加密

    引用:使用Jasypt加密:https://blog.csdn.net/rongxiang111/article/details/85255370
    使用Jasypt对.properties配置文件加密:http://www.voidcn.com/article/p-ermeyjiw-st.html
                                     http://www.voidcn.com/article/p-uasrepgn-xo.html

    使用Druid对数据库配置文件加密:https://www.jianshu.com/p/313099298e76

    数据库密码加密方案、

    一、使用Jasypt加密
    1、pom.xml中引入依赖
    <!-- jasypt加密依赖 -->
    <dependency>
       <groupId>com.github.ulisesbocchio</groupId>
       <artifactId>jasypt-spring-boot-starter</artifactId>
       <version>1.16</version>
    </dependency>
    2、application.yml配置文件中配置加密所需的salt(盐)
    # jasypt用于加密
    jasypt:
      encryptor:
        password: xxxxxx
    3、加密

    新建一个工具类JasyptUtil,main方法中加密代码示例如下:
    public static void main(String[] args) {
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        //1.加密所需的salt(盐),此处的值要与application中的配置的password一样。
        textEncryptor.setPassword("xxxxxx");
        //2.要加密的数据.运行完main方法后,将打印出的加密内容在application.yml相关参数中替换:
        String password = textEncryptor.encrypt("password_xxxxxx");
        // application.yml中替换:ENC(password)
        System.out.println("password:"+password);
    注:每次加密生成的密码均不相同,但解密后密码一致。

    4、配置加密数据

    将配置文件application.yml中的数据库的密码替换为上述结果,加密字符串要在ENC()中。

    二、使用Jasypt对.properties配置文件加密

    如果数据库配置数据存放在.properties文件中,无法通过上述方法直接解密,可使用如下两种方案解决:

    方案一:重写PropertyPlaceholderConfigurer类中的processProperties方法进行解密
    public class PropertyPlaceholderConfigurerExt extends PropertyPlaceholderConfigurer {
    
        @Override
        protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props)
                throws BeansException {
            String password = props.getProperty("mall.source.jdbc.password");
            if (password != null) {
                //解密jdbc.password属性值,并重新设置
                props.setProperty("mall.source.jdbc.password", "此处为解密算法生成的字符串");
            }
            super.processProperties(beanFactory, props);
    
        }
    }
    注释掉原有的placeholder加载方式,改为自定义的placeholder
     <bean id="propertyConfig" class="com.sogou.mall.source.internal.util.PropertyPlaceholderConfigurerExt">
            <property name="locations">
                <list>
                    <value>classpath*:需加密的配置文件</value>
                </list>
            </property>
        </bean>
    方案二、使用jasypt为spring相应版本实现的placeholder
      <bean id="environmentVariablesConfiguration"
              class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
            <property name="algorithm" value="PBEWithMD5AndDES"/>-
            <property name="password" value="xxxxxx"/>
        </bean>
        <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
            <property name="config" ref="environmentVariablesConfiguration" />
        </bean>
        <bean id="propertyConfigurer"
              class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
            <constructor-arg ref="configurationEncryptor" />
            <property name="locations">
                <list>
                    <value>classpath*:需加密的配置文件</value>
                </list>
            </property>
            <property name="fileEncoding" value="utf-8" />
        </bean>
    三、使用Druid对数据库配置文件加密

    1、创建自己的数据源

    新建类SecurityDateSource继承数据源DruidDataSource并重写其中设置用户名和密码的方法:
    public class SecurityDateSource extends DruidDataSource{
        @Override
        public void setUsername(String username) {
            try {
                username = ConfigTools.decrypt(username);
            } catch (Exception e) {
                e.printStackTrace();
            }
            super.setUsername(username);
        }
    
        @Override
        public void setPassword(String password) {
            try {
                password = ConfigTools.decrypt(password);
            } catch (Exception e) {
                e.printStackTrace();
            }
            super.setPassword(password);
        }
    
        public static void main(String[] args) throws Exception{
            String password = "123456";
            String username = "root";
            System.out.println("加密后的password = [" + ConfigTools.encrypt(password) + "]");
            System.out.println("加密后的username = [" + ConfigTools.encrypt(username) + "]");
        }
    }
    2、Spring文件中配置数据源
    <bean id="dataSource" class="xxx.SecurityDateSource"
        init-method="init" destroy-method="close">
        <property name="url" value="${connection.url}" />
        <property name="username" value="${connection.username}" />
        <property name="password" value="${connection.password}" />
        ...省略其他配置...
    </bean>

    3、加密配置文件
    #MySql数据库配置
    connection.username=xxxxxx
    connection.password=xxxxxx
     
  • 相关阅读:
    阻止 gulp 发生异常后退出
    Implementing DDD Reading
    Chrome 37 Beta: 使用Windows的DirectWrite和支持<dialog>元素
    作为一个程序员,你的进步完全取决于你自己
    Accessing Report Server using Report Server Web Service
    admin自定义后台注意事项
    BBS项目
    python之路_django中form组件
    python之路_django中ajax应用
    python之路_django 认证系统
  • 原文地址:https://www.cnblogs.com/tilamisu007/p/12036591.html
Copyright © 2011-2022 走看看