当前位置:   article > 正文

springboot2 druid加密 多数据源druid加密_druid多数据源 密文

druid多数据源 密文

前言

出于对项目的安全考虑,经常需要对数据库的密码进行加密,本文我们将带大家从源码角度进行分析各个配置的作用,使用druid的自带工具对数据进行加密。

加密代码

  1. public static void main(String[] args) {
  2. String password = "test";
  3. String[] arguments = new String[]{password};
  4. try {
  5. ConfigTools.main(arguments);
  6. } catch (Exception e) {
  7. log.info("生成密文失败,异常信息:{}", e);
  8. }
  9. }

运行后可以得到加密后的密码

    1. privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAlxFiZMO5fD1kOIc/B7R+dUsJ5EsxCXqGAC3SpiAHm/397LgpKi613kPRkzidA7olwT34gkXX7HNQnvYBngRyaQIDAQABAkAxRDUfgYkzUF4n5UuT+rQnEnLGZhM28SNUWZ1SGi4BHAHfp5pbyMEzDD+84hc5r5Euk7HEGkuUt2HNRPq4cpERAiEA4BRm3kfpuVfqSjij3zJ7UdiE54oWeAnG2XiG1hJvdmUCIQCslm8wUxksDgcvNUjQN8Pp9VZCBUzInlppanVZyUB5tQIgUSER3YjL5n8eJKE9M6JjY86wz+P/Hpbrl/E7YGZsVMECIQCPAOtKkGBYJ5t+W1lk5gAYeGertraDuOpTVJm99srMzQIgHX7T20MexhBxokUIQiXuaB8Z9CflpQY7StP/cedt9Wk=
    2. publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJcRYmTDuXw9ZDiHPwe0fnVLCeRLMQl6hgAt0qYgB5v9/ey4KSoutd5D0ZM4nQO6JcE9+IJF1+xzUJ72AZ4EcmkCAwEAAQ==
    3. password:WCACUuMVJmu01PWDOUphY5Ms7CUhG80WHJi8KqyJpIrQsVEyX5prwedps2YbkJaScUGPApuX6ZiFawfWxaDDyw==

可以看出druid默认的工具类是采用非对称加密的方式进行加密的

其中private是自动生成的随机私密,我们需要关注的值有“publicKey”跟"password",需要保存好着两个值。

配置加密

  • 首先我们需要在配置文件中开启加密

从源码中分析

com.alibaba.druid.pool.DruidDataSource#init方法中,遍历了我们所有的filter。

  1. for (Filter filter : filters) {
  2. filter.init(this);
  3. }

 为了让揭秘生效,我们需要配置解密的拦截器

  1. spring:
  2. datasource:
  3. druid:
  4. filters: config
  • 开启过滤器

这点比较重要,开启后表示druid加载时会走过滤器com.alibaba.druid.filter.config.ConfigFilter,改过滤器将对加密密码进行解密,

  1. public boolean isDecrypt(Properties connectionProperties, Properties configFileProperties) {
  2. // 读取CONFIG_DECRYPT配置,看是否进行加密,只有设置为true才会对数据库进行揭秘
  3. String decrypterId = connectionProperties.getProperty(CONFIG_DECRYPT);
  4. if (decrypterId == null || decrypterId.length() == 0) {
  5. if (configFileProperties != null) {
  6. decrypterId = configFileProperties.getProperty(CONFIG_DECRYPT);
  7. }
  8. }
  9. if (decrypterId == null || decrypterId.length() == 0) {
  10. decrypterId = System.getProperty(SYS_PROP_CONFIG_DECRYPT);
  11. }
  12. return Boolean.valueOf(decrypterId);
  13. }

从上面源码中可以看出,我们还需要配置一个CONFIG_DECRYPT,设置为true。

  1. spring:
  2. datasource:
  3. druid:
  4. connect-properties:
  5. config.decrypt: true

此时会走解密流程,此时会调用com.alibaba.druid.filter.config.ConfigFilter#decrypt方法。

  • 公钥跟密码配置

解读decrypt的方法可以看出,我们还需要配置解密的公钥配置

  1. spring:
  2. datasource:
  3. druid:
  4. config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALwTQSulMoXLHIiwpXY7V1LdLzAusZ3zPOdEHD0fSn6Nc51UAHjRli+pxgIt6M899mXhZ9k2aGzE5weuf9uNTfcCAwEAAQ==

这个公钥就是上面我们main生成的publicKey。配置好公钥后,进行我们的密码解密操作。

此时会读取我们配置的加密后的密码

  1. spring:
  2. datasource:
  3. druid:
  4. password: JjtSWRv9rPnksKAvLZwFuxkpYxbyBxJKFhe5aZGo90BS7HbbQhtEvGCEt75aqDYcyzkkvOfYSxQ5sFKoURWRBQ==

这个password就是我们上面运行main方法生成的加密密码。

补充一点,对于动态数据源的配置:

由于项目中有的用的是多数据源配置:

首先应用baomidou的多数据源maven

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  4. <version>3.5.0</version>
  5. </dependency>

对于多数据源我们需要关注

com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration类,该类加载了多数据源的配置com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties

从配置中,我们可以看出有专门的druid的一个节点

  1. /**
  2. * Druid全局参数配置
  3. */
  4. @NestedConfigurationProperty
  5. private DruidConfig druid = new DruidConfig();

查看com.baomidou.dynamic.datasource.spring.boot.autoconfigure.druid.DruidConfig#toProperties中源码:

  1. // 通过判断publicKey值来判断是否加过滤器
  2. if (publicKey != null && publicKey.length() > 0 && !filters.contains(CONFIG_STR)) {
  3. filters += "," + CONFIG_STR;
  4. }
  5. properties.setProperty(FILTERS, filters);

可以看出,我们需要配置一个publicKey,这个key就是我们上面main生成的公钥。

继续阅读下面的代码,会发现利用pulicKey还做了以下事情

  1. Properties connectProperties = connectionProperties == null ? g.getConnectionProperties() : connectionProperties;
  2. // 自动拼接config.decrypt跟config.decrypt.key
  3. if (publicKey != null && publicKey.length() > 0) {
  4. if (connectProperties == null) {
  5. connectProperties = new Properties();
  6. }
  7. connectProperties.setProperty("config.decrypt", Boolean.TRUE.toString());
  8. connectProperties.setProperty("config.decrypt.key", publicKey);
  9. }
  10. this.connectionProperties = connectProperties;

从上面的代码中,可以看出,自动帮我们配置了config.decrypt跟config.decrypt.key,所以我们不需要跟配置druid一样去配置这两个属性,默认开启解密。

最后

此时我们的密码加密就完成了。

总结一下,需要对数据库数据库进行加密,我们需要进行配置四个个地方。如下

  1. spring:
  2. datasource:
  3. druid:
  4. filters: config #配置过滤器
  5. password: ${password} #加密的密钥
  6. connect-properties:
  7. config.decrypt: true #设置为true,开启解密
  8. config.decrypt.key: ${publicKey} #解密的公钥

对于使用的baomidou的多数据源,我们需要配置两个地方,如下:

  1. spring:
  2. datasource:
  3. dynamic:
  4. enabled: true
  5. primary: master
  6. datasource:
  7. master:
  8. type: com.alibaba.druid.pool.DruidDataSource
  9. url: jdbc:mysql://url/dbname?useUnicode=true&characterEncoding=utf-8&
  10. username: test
  11. password: ${passord} #加密的密码
  12. driver-class-name: com.mysql.jdbc.Driver
  13. druid:
  14. filters: config #开启过滤器
  15. publicKey: ${publicKey} #生成的公钥

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

闽ICP备14008679号