`
hbxflihua
  • 浏览: 676192 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

springboot中增强druid实现数据库账号密码加解密

阅读更多

       针对目前越来越严的安全等级要求,我们在做产品研发和项目开发时,越来越需要注意安全问题,各种账号密码的在配置文件中明文存储就是一个很大的安全隐患。

 

        现针对数据库密码加解密方面,利用druid工具类进行数据库加密,实现项目配置文件中数据库密码密文存储,一定程度上保证了数据安全。

 

        步骤一:pom中引入druid依赖

        <!-- druid数据源驱动 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

         

        步骤二:添加druid的filter

package com.huatech.cloud.filter;

import java.security.PublicKey;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.alibaba.druid.filter.FilterAdapter;
import com.alibaba.druid.filter.config.ConfigTools;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.proxy.jdbc.DataSourceProxy;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class DruidDataSourceFilter extends FilterAdapter {
    
	
    @Value("${crypto.public-key}")
    private String decryptKey;
	
    @Override
    public void init(DataSourceProxy dataSourceProxy) {
		if (!(dataSourceProxy instanceof DruidDataSource)) {
            log.error("ConfigLoader only support DruidDataSource");
            return;
        }

        DruidDataSource dataSource = (DruidDataSource) dataSourceProxy;
        // 判断是否需要解密,如果需要就进行解密行动
        if (isNotEmpty(decryptKey)) {
            decrypt(dataSource);
        }
    }
	
    public void decrypt(DruidDataSource dataSource) {

        try {
            String encryptedUsername = null, encryptedPassword = null;
           
            if (encryptedUsername == null || encryptedUsername.length() == 0) {
            	encryptedUsername = dataSource.getUsername();
            }
            
            if (encryptedPassword == null || encryptedPassword.length() == 0) {
                encryptedPassword = dataSource.getPassword();
            }

            PublicKey publicKey =  ConfigTools.getPublicKey(decryptKey);

            String usernamePlainText = ConfigTools.decrypt(publicKey, encryptedUsername);
            String passwordPlainText = ConfigTools.decrypt(publicKey, encryptedPassword);

            dataSource.setUsername(usernamePlainText);
            dataSource.setPassword(passwordPlainText);
            
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to decrypt.", e);
        }
    }
    
    public boolean isNotEmpty(String source) {
    	return source != null && !"".equals(source.trim());
    }
	
}

 

        步骤三:通过Druid的ConfigTools工具类生成秘钥对,最后一个参数为待加密内容

java -cp druid-1.1.17.jar com.alibaba.druid.filter.config.ConfigTools abc
privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAlL2KkAHx1etX6V/A8JrTmLtvd4H/3yectN0RdkEro2z/ItPNdt/gP7W1PTOusSUrD/N4EVbMWNwaUrzBbRYwgwIDAQABAkB9DY693KSyshdLgtH4eHOGabAhzg6OVAOQnHzd65UA5I6sD1ehGT3jjLvNFovenOpzGY0TeYoIonWTlzIb/NJhAiEAyMU9C6l89KIVOiShC/XPEXgj1LtEO4ik/ZlJ6GNbye8CIQC9qDbmctuX8fNeyJMdSluwXjyUNCmVsOE0cnijY37mrQIgTbnudEFdmufVB/l+T78ON1knpggJ1nKETZm2vz0YIAkCIFphz8gC9KN0qoaBD5rl1Mw4HKaENU0g/jIAW32B7PgBAiEAooZbdtng4IrLw47/5SDWiunYrC2BHR59rApQnKkia1A=
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJS9ipAB8dXrV+lfwPCa05i7b3eB/98nnLTdEXZBK6Ns/yLTzXbf4D+1tT0zrrElKw/zeBFWzFjcGlK8wW0WMIMCAwEAAQ==
password:N9Noez2waEtPZSjc6UI2v3wZVaORBX5JPPZsL4IxUlFCa49wIhGZF71c3hV6z6Gm3s8MvMk0ief5rWdr5+p63g==

 

        步骤四:application.yml中配置数据源信息和秘钥对公钥

#配置数据源
spring:
  datasource:
    druid:
      type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/weapp-mall?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useAffectedRows=true
      username: N9Noez2waEtPZSjc6UI2v3wZVaORBX5JPPZsL4IxUlFCa49wIhGZF71c3hV6z6Gm3s8MvMk0ief5rWdr5+p63g==
      password: N9Noez2waEtPZSjc6UI2v3wZVaORBX5JPPZsL4IxUlFCa49wIhGZF71c3hV6z6Gm3s8MvMk0ief5rWdr5+p63g==
# rsa算法加解密配置,配置公钥
crypto: 
  public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJS9ipAB8dXrV+lfwPCa05i7b3eB/98nnLTdEXZBK6Ns/yLTzXbf4D+1tT0zrrElKw/zeBFWzFjcGlK8wW0WMIMCAwEAAQ==

 

         如果觉得RSA加密算法太过复杂,可以使用jasypt工具类来加解密,具体操作如下。

        STEP1:pom.xml中添加依赖

        <!-- druid数据源驱动 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>
        <!-- jasypt -->
        <dependency>
            <groupId>org.jasypt</groupId>
            <artifactId>jasypt</artifactId>
            <version>${jasypt.version}</version>
        </dependency>

 

        STEP2:引入加解密工具类EncryptorTools

package com.huatech.cloud.config;

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

@Configuration
public class EncryptorTools implements Ordered {
	
	@Value("${encryptor.password}")
	private String password;
			
	@ConditionalOnProperty(name = "encryptor.enable", havingValue = "true", matchIfMissing = true)
	@Bean
	public StringEncryptor stringEncryptor() {
		StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
		EnvironmentPBEConfig config = new EnvironmentPBEConfig();
		config.setPassword(password);                
		standardPBEStringEncryptor.setConfig(config);
		return standardPBEStringEncryptor;
	}
	
	public static String decrypt(StringEncryptor stringEncryptor, final String encodedValue) {
		if(stringEncryptor != null) {
			try {
    			return stringEncryptor.decrypt(encodedValue);
    		}catch(Exception e) {
    			return encodedValue;
    		}
		}else {
			return encodedValue;
		}
	}
	
    public static String encrypt(StringEncryptor stringEncryptor, final String plainVaue) {
    	if(stringEncryptor != null) {
    		try {
    			return stringEncryptor.encrypt(plainVaue);
    		}catch(Exception e) {
    			return plainVaue;
    		}
    	}else {
    		return plainVaue;
    	}
    }
    
    public static String encrypt(String password, String plainText){
        StandardPBEStringEncryptor stringEncryptor = new StandardPBEStringEncryptor();
		EnvironmentPBEConfig config = new EnvironmentPBEConfig();
		config.setPassword(password);                
		stringEncryptor.setConfig(config);
        return stringEncryptor.encrypt(plainText);
	}
    
    public static void main(String[] args) {
		System.out.println(encrypt("rdc", "root"));
	}

	@Override
	public int getOrder() {
		return 0;
	}

}

 

        STEP3:添加druid的filterJasyptDataSourceFilter

package com.huatech.cloud.filter;

import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.druid.filter.FilterAdapter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.proxy.jdbc.DataSourceProxy;
import com.huatech.cloud.config.EncryptorTools;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class JasyptDataSourceFilter extends FilterAdapter {
    
	@Autowired(required = false)
	private StringEncryptor stringEncryptor;
	 
	@Override
    public void init(DataSourceProxy dataSourceProxy) {
		if (!(dataSourceProxy instanceof DruidDataSource)) {
            log.error("ConfigLoader only support DruidDataSource");
            return;
        }

        DruidDataSource dataSource = (DruidDataSource) dataSourceProxy;
        // 判断是否需要解密,如果需要就进行解密行动
        dataSource.setUsername(decrypt(dataSource.getUsername()));
        dataSource.setPassword(decrypt(dataSource.getPassword()));
    }
	

	public String decrypt(String ecryptValue) {
		return EncryptorTools.decrypt(stringEncryptor, ecryptValue);
	}
	
}

 

 

        STEP4:application.yml中配置数据源信息和加解密密码信息

# jasypt加解密配置
encryptor: 
  enable: true
  password: rdc  
#配置数据源
spring:
  datasource:
    druid:
      type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/weapp-mall?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useAffectedRows=true
      username: 8rYwAh2Qj7E7iqLB7S3QOg==
      password: 8rYwAh2Qj7E7iqLB7S3QOg==

 

 本文相关代码已上传至gitee

分享到:
评论

相关推荐

    SpringBoot(七)SpringBoot整合Druid实现数据库密码加密.pdf

    ### Spring Boot 整合 Druid 实现数据库密码加密 #### 一、引言 在实际的生产环境中,数据库的安全性非常重要,尤其是数据库连接信息中的用户名和密码。为了防止这些敏感信息被泄露,通常需要采取措施来保护这些...

    druid实现springmvc数据库连接的用户名和密码加密

    标题"druid实现springmvc数据库连接的用户名和密码加密"指出,我们要讨论的是如何在Spring MVC项目中利用Druid连接池进行更高级别的安全性配置,即对数据库连接的敏感信息进行加密。这通常涉及以下步骤: 1. **密码...

    Springboot项目对数据库用户名密码实现加密过程解析

    本文详细介绍了如何在Springboot项目中实现数据库用户名密码的加密过程,包括使用jasypt库对密码进行加密、配置加密后的密码密文到Spring Boot配置文件中,以及设置加密的秘钥环境变量。希望本文能够对大家的学习和...

    springboot+mybatis+druid+redis实现数据库读写分离和缓存

    本项目采用SpringBoot、MyBatis、Druid和Redis这四个核心技术来实现这一目标。以下将详细讲解这些组件如何协同工作,以及它们各自的作用。 1. **SpringBoot**:SpringBoot是由Pivotal团队提供的全新框架,它简化了...

    Springboot中使用Druid+JPA

    在Spring Boot应用中,Druid和JPA是两种常见的数据库操作工具。Druid是一个功能强大的数据库连接池,而JPA(Java Persistence API)是Java平台上的一个标准,用于对象关系映射(ORM)。本篇文章将深入探讨如何在...

    SpringBoot整合Mybatis使用Druid数据库连接池

    SpringBoot 整合 Mybatis 使用 Druid 数据库连接池 Spring Boot 是一个基于 Java 的框架,提供了快速开发和生产级别的应用程序的能力。Mybatis 是一个基于 Java 的持久层框架,提供了对数据库的访问和操作的能力。...

    集成druid实现数据库密码加密功能.zip

    在实际开发中,数据库密码明文存储是一个安全隐患,为了保护这些敏感信息,我们可以利用Druid的数据源配置来实现密码加密。以下是一种常见的实现方式: 1. **密码加密**:首先,我们需要一个加密算法(如MD5、AES等...

    SpringBoot整合JDBC&Druid;数据源示例

    在本文中,我们将深入探讨如何在SpringBoot项目中整合JDBC和Druid数据源,并创建一个具有监控功能的示例。SpringBoot以其简洁的配置和快速的开发能力,深受Java开发者喜爱。而Druid作为一款优秀的数据库连接池,提供...

    SpringBoot2.0整合Druid连接池详细步骤.docx

    在 SpringBoot 项目中,需要配置 Druid 管理后台,以便于查看数据库连接池的状态。首先,需要在配置类中添加 Druid 的 Servlet 和 Filter: ```java package com.example.eurekaclient.config; import ...

    SpringBoot+Mybatis+Druid+PageHelper实现多数据源并分页方法

    在SpringBoot中整合Mybatis,主要是通过配置文件设置数据源和Mapper扫描路径,以及引入Mybatis-Spring-Boot-Starter依赖。 Druid是一个强大的数据库连接池组件,它具有监控功能,能够帮助开发者优化数据库访问性能...

    springboot+mybatis3+druid+postgresql

    在本项目中,"springboot+mybatis3+druid+postgresql"的组合是一个常见的高效、轻量级的Java Web开发架构。Spring Boot简化了Spring应用程序的创建和配置,MyBatis作为持久层框架提供了灵活的SQL映射,Druid是数据库...

    SpringBoot + mybatis-plus + druid 实现mySql与Orcl双数据源

    总结起来,通过SpringBoot、Mybatis-Plus和Druid,我们可以方便地实现双数据源配置,使得应用能同时处理MySQL和Oracle数据库的数据。在实际开发中,要根据业务场景灵活切换数据源,确保数据操作的正确性和效率。同时...

    springboot整合druid、mybatis连接gbase8s.doc

    在本文中,我们将深入探讨如何将SpringBoot与Druid数据源和MyBatis集成,以连接到Gbase8s v8.7数据库。Gbase8s是一款高性能的关系型数据库管理系统,特别适合处理大规模数据。我们将使用Spring Boot 2.1.11版本,...

    springboot+mysql+oracle+druid 双数据库进行数据同步

    **双数据源**:在SpringBoot中,通过`Spring Boot Data JPA`和`DataSource`配置,我们可以设置多个数据源。这通常需要使用`@Primary`注解来标记主数据源,同时定义另一个数据源。在本项目中,Oracle作为源数据库,...

    druid对配置文件中的数据库密码的加密

    druid对配置文件中的数据库密码的加密................................................

    springboot+mybatis+druid整合 包括druid监控配置

    搞了一下午 见识到了springboot和druid的好用之处 监控太好用搞了一下午 见识到了springboot和druid的好用之处 监控太好用

    数据库密码配置加密操作步骤.doc

    在 Druid 中,使用 Druid 的内置加密机制来实现数据库密码加密。首先,找到 com.alibaba.druid 的本地 Maven jar 包,然后生成加密密码和公钥: ```bash java -cp druid-1.1.17.jar ...

    Springboot整合Druid与Mybatis的多数据源切换

    本教程将详细介绍如何在Spring Boot项目中整合Druid数据源池与Mybatis,实现多数据源切换的功能,并提供一个亲测可用的解决方案。 首先,让我们了解Spring Boot、Druid和Mybatis这三大组件的基础知识: **Spring ...

Global site tag (gtag.js) - Google Analytics