当前位置:   article > 正文

druid/jasypt实现多数据源加密_druid连接池使用jasypt加密密码

druid连接池使用jasypt加密密码

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

1 druid实现单数据源加密

1.添加依赖 ,加密密码

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid-spring-boot-starter</artifactId>
  4. <version>${druid.version}</version>
  5. </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,在配置文件中将密码替换成加密后的,并添加下面两个配置

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

2 druid实现多数据源加密

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

多数据源配置

  1. @Configuration
  2. public class MultiDataSourceConfig {
  3. @Bean(name = "datasource1")//数据源名称1
  4. @ConfigurationProperties(prefix = "spring.datasource.druid.datasource1")
  5. public DataSource dataSource1() {
  6. return new DruidDataSource();
  7. }
  8. @Bean(name = "server")//数据源名称2
  9. @ConfigurationProperties(prefix = "spring.datasource.druid.server")
  10. public DataSource dataSource2() {
  11. return new DruidDataSource();
  12. }
  13. }

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

  1. @Configuration
  2. @MapperScan(basePackages = "cn.com.hello.zydt.dao", sqlSessionTemplateRef = "test2SqlSessionTemplate")//这里指定数据源对应的dao包,和另外一个数据源不能重合
  3. public class DataSource2Config {
  4. @Bean(name = "test2SqlSessionFactory")
  5. public SqlSessionFactory testSqlSessionFactory(@Qualifier("server") DataSource dataSource) throws Exception {//这里的server是数据源的名称
  6. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  7. bean.setDataSource(dataSource);
  8. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:config/mappers/*" +//执行的对应xml文件路径
  9. ".xml"));
  10. return bean.getObject();
  11. }
  12. @Bean(name = "test2TransactionManager")
  13. public DataSourceTransactionManager testTransactionManager(@Qualifier("server") DataSource dataSource) {//同样是数据源名称
  14. return new DataSourceTransactionManager(dataSource);
  15. }
  16. @Bean(name = "test2SqlSessionTemplate")
  17. public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  18. return new SqlSessionTemplate(sqlSessionFactory);
  19. }
  20. }

druid自定义解密回调函数

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

  1. public class DbPasswordCallback extends DruidPasswordCallback {
  2. private static final Logger logger = LoggerFactory.getLogger(DbPasswordCallback.class);
  3. @Override
  4. public void setProperties(Properties properties){
  5. super.setProperties(properties);
  6. String publickey = "";
  7. //获取application里面配置的密码和公钥
  8. String password = (String) properties.get("password");
  9. publickey = (String) properties.get("publicKey");
  10. try {
  11. String dbpassword = ConfigTools.decrypt(publickey, password);
  12. setPassword(dbpassword.toCharArray());
  13. } catch (Exception e) {
  14. logger.error("Druid ConfigTools.decrypt", e);
  15. }
  16. }
  17. }

修改配置文件

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

3 jasypt 加密

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

1.添加依赖

  1. <dependency>
  2. <groupId>com.github.ulisesbocchio</groupId>
  3. <artifactId>jasypt-spring-boot-starter</artifactId>
  4. <version>3.0.4</version>
  5. </dependency>

2.对密码进行加密

  1. public class JasyptUtil {
  2. /**
  3. * 解密方法
  4. * @param password
  5. * @param value
  6. * @return
  7. */
  8. private static String decyptPwd(String password, String value) {
  9. PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
  10. encryptor.setConfig(cryptor(password));
  11. return encryptor.decrypt(value);
  12. }
  13. /**
  14. * 加密方法
  15. * @param password
  16. * @param value
  17. * @return
  18. */
  19. private static String encyptPwd(String password, String value) {
  20. PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
  21. encryptor.setConfig(cryptor(password));
  22. return encryptor.encrypt(value);
  23. }
  24. /**
  25. * 配置信息
  26. * @param password
  27. * @return
  28. */
  29. private static SimpleStringPBEConfig cryptor(String password) {
  30. SimpleStringPBEConfig config = new SimpleStringPBEConfig();
  31. config.setPassword(password);
  32. config.setAlgorithm("PBEWithMD5AndDES");
  33. config.setKeyObtentionIterations("1000");
  34. config.setPoolSize("1");
  35. config.setProviderName("SunJCE");
  36. config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
  37. config.setStringOutputType("base64");
  38. return config;
  39. }
  40. /* public static void main(String[] args) {
  41. String slat = "cfds";
  42. // 加密
  43. String encPwd = encyptPwd(slat, "未加密的密码");
  44. //解密
  45. String decPwd = decyptPwd(slat, encPwd);
  46. System.out.println("加密后的密码:" + encPwd);
  47. }*/
  48. }

3.配置信息修改

  1. #加密配置项
  2. jasypt.encryptor.password=cfds//加密的密钥
  3. jasypt.encryptor.algorithm=PBEWithMD5AndDES//指定了加密算法
  4. jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator//指定了初始化向量(IV)生成器的类名
  5. #加密后的密码
  6. spring.datasource.server.password=ENC(vydZNCy0vVNFhdrV+R94Ki)

记录使用,欢迎交流。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/844112
推荐阅读
相关标签
  

闽ICP备14008679号