springboot+druid+dynamic-datasource+mysql数据库密码加密

背景

生产环境中, 希望将数据库密码加密, 甚至用户名加密。druid自带了数据库密码加密功能。

springboot+druid-starter实现密码加密

  1. 获取公钥和加密密码。这里使用druid-start,官方有加密方法说明:GitHub wiki
    简单总结下就是:在本地maven仓库找到druid的jar包, 然后在CMD窗口执行命令以下命令即可得到
java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools you_password

输出:

privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==
password:PNak4Yui0+2Ft6JSoKBsgNPl+A033rdLhFw+L0np1o+HDRrCo9VkCuiiXviEMYwUgpHZUFxb2FpE0YmSguuRww==
  1. 在springboot application配置文件中添加一下内容

如果是application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=root
# 步骤一生成的password, 即就是密码密码
spring.datasource.password=QNLWJMvsISqe85sel6w8lSjxis/JvJwnhA7BuqFAuMKJBysYZTVQqBQiOmdyJAiv6ulU2BPu0JeUU1wpWRoVrA==
# 生成的公钥
public-key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIj3KZDSeXpjJ0/cRoVXDvlvMCToCSxhZddVs8roF3Nq4/2I7MdmB7keqJstl+HcfYUtjrcclJFtpUZHzHbc14MCAwEAAQ==
# 配置 connection-properties,启用加密,配置公钥。
spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
# 启用ConfigFilter
spring.datasource.druid.filter.config.enabled=true

如果是application.yml

# 步骤一生成的publicKey生成的公钥
public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIj3KZDSeXpjJ0/cRoVXDvlvMCToCSxhZddVs8roF3Nq4/2I7MdmB7keqJstl+HcfYUtjrcclJFtpUZHzHbc14MCAwEAAQ==

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb?useSSL=false
    username: root
    # 步骤一生成的password, 即就是密码密码
    password: QNLWJMvsISqe85sel6w8lSjxis/JvJwnhA7BuqFAuMKJBysYZTVQqBQiOmdyJAiv6ulU2BPu0JeUU1wpWRoVrA==
    driver-class-name: com.mysql.jdbc.Driver
    druid:
      connection-properties: config.decrypt=true;config.decrypt.key=${public-key}
      filter:
        config:
          enabled: true

springboot+dynamic-datasource-starter实现密码加密

该框架自带加密 ENC()。官方地址 功能说明如图
在这里插入图片描述

经过查看源码发现, 该框架使用自带的加密工具类com.baomidou.dynamic.datasource.toolkit.CryptoUtils进行加解密, 且自带有公钥私钥, 所以直接使用此工具类加密我们的明文密码, 然后用ENC()包裹即可实现加解密。

具体操作:

  1. 调用加密方法
@Test
void test() throws Exception {
    // 假如我们的密码为
    String root = CryptoUtils.encrypt("root");
    System.out.println(root);
    // 输出加密密码
    // VZamSTMi224AH6RUtJGXNldiDp/XEL2ozRhBUu/o9ChodT4JEb9kE......
}
  1. 修改配置文件中的密码
spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false
          username: root
          # 用ENC将密码包裹起来
          password: ENC(VZamSTMi224AH6RUtJGXNldiDp/XEL2ozRhBUu/o9ChodT4JEb9kE/....)
      druid:
        # 选填
        public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIj3KZDSeXpjJ0/cRoVXDvlvMCToCSxhZd....

通过查看源码还可以发现, 用户名/密码/数据库连接都可以使用此方法加密

// com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty
public String getUrl() {
	return decrypt(url);
}

public String getUsername() {
    return decrypt(username);
}

public String getPassword() {
    return decrypt(password);
}

/**
 * 字符串解密
 */
private String decrypt(String cipherText) {
    if (StringUtils.hasText(cipherText)) {
        Matcher matcher = ENC_PATTERN.matcher(cipherText);
        if (matcher.find()) {
            try {
                return CryptoUtils.decrypt(publicKey, matcher.group(1));
            } catch (Exception e) {
                log.error("DynamicDataSourceProperties.decrypt error ", e);
            }
        }
    }
    return cipherText;
}

结束

您可以通过创建一个配置类来配置springboot+DruidDataSource+shardingsphere的数据库配置,而不是将配置信息放在yml文件中。以下是一个示例配置类的代码: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DruidDataSourceBuilder.create().build(); } @Bean public DataSourceProxy dataSourceProxy(DataSource dataSource) { return new DataSourceProxy(dataSource); } @Bean public DataSourceRule dataSourceRule(DataSourceProxy dataSourceProxy) { DataSourceRule dataSourceRule = new DataSourceRule(dataSourceProxy); // 配置分库分表规则 // dataSourceRule.addDataSourceRule(...) // dataSourceRule.addTableRule(...) return dataSourceRule; } @Bean public ShardingRule shardingRule(DataSourceRule dataSourceRule) { ShardingRule shardingRule = ShardingRule.builder() .dataSourceRule(dataSourceRule) // 配置分片规则 // shardingRule.getTableRuleConfigs().add(...) .build(); return shardingRule; } @Bean public DataSource dataSource(ShardingRule shardingRule) throws SQLException { return ShardingDataSourceFactory.createDataSource(shardingRule); } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); // 配置其他属性 // sessionFactory.setMapperLocations(...) return sessionFactory.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } ``` 您可以根据自己的需求在配置类中添加适当的配置,比如配置数据源、分库分表规则、分片规则等。这样,您就可以将数据库配置信息集中在一个配置类中,而不是放在yml文件中。 #### 引用[.reference_title] - *1* *2* [springboot+druid连接池+mybatisplus+shardingsphere5.0alpha实现分库分表实战案例](https://blog.csdn.net/qq_40726812/article/details/120594172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Springboot+mybatis+shardingsphere 分库分表](https://blog.csdn.net/l_ian/article/details/120547449)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值