druid/jasypt实现多数据源加密

配置文件中展示了密码明文,审查不允许,要求加密。

1 druid实现单数据源加密

1.添加依赖 ,加密密码

<dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>

2.加密密码,

找到jar包druid-1.1.9.jar,注意这个jar包和上面的不是一个,在这个jar包的位置下,进入cmd,使用命令实现加密

java -cp druid-1.1.9.jar com.alibaba.druid.filter.config.ConfigTools 你的密码 >a.txt,

复制 公钥publickey和加密后的密码password,在配置文件中将密码替换成加密后的,并添加下面两个配置

public-key=你生成的公钥
spring.datasource.druid.filter.config.enabled=true
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}

2 druid实现多数据源加密

首先你的代码中dao类和mpper类是否根据数据源分包,不然我下面的方法没有办法实现。

多数据源配置

@Configuration
public class MultiDataSourceConfig {

    @Bean(name = "datasource1")//数据源名称1
    @ConfigurationProperties(prefix = "spring.datasource.druid.datasource1")
    public DataSource dataSource1() {
        return new DruidDataSource();
    }


    @Bean(name = "server")//数据源名称2
    @ConfigurationProperties(prefix = "spring.datasource.druid.server")
    public DataSource dataSource2() {
        return new DruidDataSource();
    }

}

具体单个数据源配置,这里只是一个数据源,另外一个数据源也要配置,只需要替换参数就可以。

@Configuration
@MapperScan(basePackages = "cn.com.hello.zydt.dao", sqlSessionTemplateRef  = "test2SqlSessionTemplate")//这里指定数据源对应的dao包,和另外一个数据源不能重合
public class DataSource2Config {

    @Bean(name = "test2SqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("server") DataSource dataSource) throws Exception {//这里的server是数据源的名称
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:config/mappers/*" +//执行的对应xml文件路径
                ".xml"));
        return bean.getObject();
    }

    @Bean(name = "test2TransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("server") DataSource dataSource) {//同样是数据源名称
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test2SqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

druid自定义解密回调函数

不同于单个数据加密,多数据源加密需要配置回调函数

    public class DbPasswordCallback extends DruidPasswordCallback {

        private static final Logger logger = LoggerFactory.getLogger(DbPasswordCallback.class);

        @Override
        public void setProperties(Properties properties){
            super.setProperties(properties);
            String publickey = "";
            //获取application里面配置的密码和公钥
            String password = (String) properties.get("password");
             publickey = (String) properties.get("publicKey");
            try {
                String dbpassword = ConfigTools.decrypt(publickey, password);
                setPassword(dbpassword.toCharArray());
            } catch (Exception e) {
                logger.error("Druid ConfigTools.decrypt", e);
            }
        }
    }

修改配置文件

public-key = 你生成的公钥
spring.datasource.druid.server.name=server//指定数据源名称
spring.datasource.druid.server.filter.config.enabled=true
spring.datasource.druid.server.connection-properties=config.decrypt=true;publicKey=${public-key};password=${spring.datasource.password}
spring.datasource.druid.server.password-callback-class-name = xxx.xxx.DbPasswordCallback//指定解密函数

3 jasypt 加密

上面的方法如果dao类本来分包了,要改动的地方就很少,而且不用添加jar包。但如果不是,就需要自己分包,改动是一个大工程。jasypt是一个专门加密的包,可以对任何配置项进行加密。

1.添加依赖

            <dependency>
                <groupId>com.github.ulisesbocchio</groupId>
                <artifactId>jasypt-spring-boot-starter</artifactId>
                <version>3.0.4</version>
            </dependency>

2.对密码进行加密

public class JasyptUtil {


    /**
     * 解密方法
     * @param password
     * @param value
     * @return
     */
    private static String decyptPwd(String password, String value) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(cryptor(password));
        return encryptor.decrypt(value);
    }
    /**
     * 加密方法
     * @param password
     * @param value
     * @return
     */
    private static String encyptPwd(String password, String value) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(cryptor(password));
        return encryptor.encrypt(value);
    }

    /**
     * 配置信息
     * @param password
     * @return
     */
    private static SimpleStringPBEConfig cryptor(String password) {
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        return config;
    }

/*    public static void main(String[] args) {
        String slat = "cfds";
        // 加密
        String encPwd = encyptPwd(slat, "未加密的密码");
        //解密
        String decPwd = decyptPwd(slat, encPwd);
        System.out.println("加密后的密码:" + encPwd);

    }*/
}

3.配置信息修改

#加密配置项
jasypt.encryptor.password=cfds//加密的密钥
jasypt.encryptor.algorithm=PBEWithMD5AndDES//指定了加密算法
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator//指定了初始化向量(IV)生成器的类名


#加密后的密码
spring.datasource.server.password=ENC(vydZNCy0vVNFhdrV+R94Ki)

记录使用,欢迎交流。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤来实现Spring Boot Druid多数据源实现分布式事务: 1. 引入相关依赖 在pom.xml文件中引入以下依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-transaction</artifactId> </dependency> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.3.1</version> </dependency> ``` 2. 配置Druid数据源 在application.yml文件中配置Druid数据源,例如: ``` spring: datasource: druid: default: url: jdbc:mysql://localhost:3306/db1 username: root password: root driver-class-name: com.mysql.jdbc.Driver second: url: jdbc:mysql://localhost:3306/db2 username: root password: root driver-class-name: com.mysql.jdbc.Driver ``` 3. 配置MyBatis 在application.yml文件中配置MyBatis,例如: ``` mybatis: configuration: map-underscore-to-camel-case: true mapper-locations: classpath*:mapper/*.xml ``` 4. 配置分布式事务 使用Spring Boot的事务管理器来管理分布式事务。在配置类中添加注解@EnableTransactionManagement来启用事务管理器,并使用注解@Transaction来标记需要进行事务管理的方法,例如: ``` @Configuration @EnableTransactionManagement public class MyBatisConfig { @Autowired private DataSource dataSource; @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath*:mapper/*.xml")); return sessionFactory.getObject(); } @Bean public PlatformTransactionManager platformTransactionManager() { return new DataSourceTransactionManager(dataSource); } @Bean public RetryTemplate retryTemplate() { RetryTemplate retryTemplate = new RetryTemplate(); SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); retryPolicy.setMaxAttempts(3); FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); backOffPolicy.setBackOffPeriod(1000L); retryTemplate.setRetryPolicy(retryPolicy); retryTemplate.setBackOffPolicy(backOffPolicy); return retryTemplate; } } ``` 以上是Spring Boot Druid多数据源实现分布式事务的步骤,希望能对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值