druid加密

Druid 数据库密码加密

一、Druid密码加密原理

Druid使用RSA非对称加密算法进行密码加密。RSA算法通过生成一对公钥和私钥来实现加密和解密操作。公钥用于加密数据,而私钥则用于解密数据。在Druid中,原始密码使用私钥进行加密,生成密文,密文可以保存在配置文件或数据库中。当需要验证密码时,可以使用公钥对密文进行解密,还原成原始密码进行比较。

二、Druid密码加密步骤

  • 生成密钥对
    Druid的ConfigTools工具类可以生成RSA公钥和私钥对。这对密钥用于后续的加密和解密操作。

  • 加密密码
    使用私钥对原始密码进行加密,生成加密后的密码(密文)。这个加密过程可以通过执行ConfigTools工具类提供的加密方法来实现,或者通过Druid提供的命令行工具来执行。

  • 配置加密后的密码
    将加密后的密码(密文)和公钥配置在数据库连接池的配置文件中。这样,当数据库连接池需要连接数据库时,就可以使用公钥来解密加密后的密码,从而获取到明文密码进行数据库连接。

三、具体实现方式

1. 使用ConfigTools工具类

Druid的ConfigTools工具类提供了加密和解密的方法。你可以通过编写Java代码来调用这些方法,也可以使用Druid提供的命令行工具来执行加密操作。

命令行加密示例:

java -cp druid-xxx.jar com.alibaba.druid.filter.config.ConfigTools your_password

这里druid-xxx.jar是Druid的jar包路径,your_password是你要加密的原始密码。执行命令后,会在控制台输出加密后的密码(密文)和公钥。

2. 配置加密后的密码和公钥

在数据库连接池的配置文件中(如application.yml或application.properties),将加密后的密码和公钥配置到相应的位置。例如:

spring:
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/your_database
      username: root
      password: 加密后的密码
      publicKey: 公钥
      connection-properties: config.decrypt=true;config.decrypt.key=${publicKey}
      filter:
        config:
          enabled: true
publicKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

注意:在配置文件中,password字段应填写加密后的密码,publicKey字段应填写生成的公钥。同时,需要配置connection-properties属性来启用加密功能,并指定解密密钥为公钥。

四、注意事项

保护私钥安全:私钥是解密加密密码的关键,必须妥善保管,防止泄露。
定期更换密钥:为了增强安全性,建议定期更换公钥和私钥对。
配置正确:在配置文件中正确配置加密后的密码和公钥,确保数据库连接池能够正确解密密码并连接到数据库。

示例代码

常用方法

  • String[] keyPair = ConfigTools.genKeyPair(int keySize);
    生成两个字符串,可分别当作公钥与私钥
  • ConfigTools.encrypt(String privateKey, String plainText ) 加密
  • ConfigTools.decrypt(String publicKey, String plainText)解密
/**
 * 数据库加密
 */
public class DruidEncryptUtil {

    private static String publicKey; //公钥

    private static String privateKey; //私钥

    static {
        try {
            String[] keyPair = ConfigTools.genKeyPair(1024);
            privateKey = keyPair[0];
            System.out.println("privateKey:" + privateKey);
            publicKey = keyPair[1];
            System.out.println("publicKey:" + publicKey);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }
    }



    //加密 -- 返回加密后密码
    public static String encrypt(String str) throws Exception {
        String encrypt = ConfigTools.encrypt(privateKey,str);
        System.out.println("encrypt : " + encrypt);
        return encrypt;
    }

    //解密
    public static String decrypt(String str) throws Exception {
        String decrypt = ConfigTools.decrypt(publicKey,str);
        System.out.println("decrypt : " + decrypt);
        return decrypt;
    }

    /**
     * 在启动时传递参数
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //encrypt(args[0]);
        encrypt("20021207");
    }

}

该文件的作用只是为了得到 公钥私钥 以及根据私钥加密后的密码,传递的字符串为 原始密码==解密后的密码。

公钥是用来解密的,私钥是用来加密的

得到之后这个文件就可以删除了,保存这些密钥即可。
解密过程在Druid内部进行,因为有依赖的存在,不需要手动解密。
最主要的是进行配置

扩展
同样,可以使用一样的思路对用户名IP地址等加密

RSA密钥

Druid本身作为一个数据库连接池,并不直接提供生成RSA密钥的功能。但是,Druid的ConfigTools工具类可以与RSA加密结合使用,来加密数据库密码。生成RSA密钥通常需要使用Java的加密库(如java.security包下的类)

以下是生成RSA密钥的方法,这些方法可以与Druid的ConfigTools工具类结合使用来加密数据库密码:

使用Java代码生成RSA密钥

导入必要的包
需要导入java.security包下的相关类,如KeyPairGeneratorr等。

生成密钥对
使用 KeyPairGenerator 类生成RSA密钥对。可以指定密钥的长度(如2048位)。

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;

public class RSAKeyPairGenerator {
	//keySize -- 指定密钥长度
    public static KeyPair generateKeyPair(int keySize) throws NoSuchAlgorithmException, NoSuchProviderException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(keySize);
        return keyPairGenerator.generateKeyPair();
    }

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException {
        KeyPair keyPair = generateKeyPair(2048);
        // 这里可以打印出公钥和私钥,或者保存到文件中
    }
}

提取公钥和私钥:
从生成的KeyPair对象中提取公钥和私钥,并保存为字符串或文件。

常用方法

KeyPairGenerator 生成密钥

KeyPairGenerator类是Java加密架构(Java Cryptography Architecture, JCA)中的一个重要组成部分,它用于生成公钥和私钥对。这个类提供了多个方法和功能,以下是KeyPairGenerator类的一些常用方法和描述:

常用方法

  1. getInstance(String algorithm)
    描述:此方法用于获取指定算法的KeyPairGenerator实例。算法名称是一个字符串,它指定了要使用的密钥对生成算法,如"RSA"、"DSA"等。
    参数:algorithm - 密钥对生成算法的名称。
    返回值:返回指定算法的KeyPairGenerator实例。
    异常:如果找不到指定算法的KeyPairGenerator实现,将抛出NoSuchAlgorithmException。

  2. initialize(int keysize)
    描述:此方法用于初始化密钥对生成器,以生成具有指定密钥大小的密钥对。密钥大小是一个整 数,它定义了密钥的强度。
    参数:keysize - 密钥对中的密钥大小(以位为单位)。
    注意:此方法的实现将使用默认的参数集合和提供程序(以最高优先级安装)的SecureRandom实现作为随机源。

  3. generateKeyPair()
    描述:此方法用于生成密钥对。在调用此方法之前,必须先通过调用initialize方法之一来初始化KeyPairGenerator。
    返回值:返回一个KeyPair对象,该对象包含生成的公钥和私钥。

  4. initialize(int keysize, SecureRandom random)
    描述:此方法类似于initialize(int keysize),但它允许指定一个SecureRandom实例作为随机源,以便生成密钥对。
    参数:keysize - 密钥对中的密钥大小(以位为单位);random - 用于生成密钥对的随机源。
    注意:通过指定随机源,可以增加密钥生成的随机性和安全性。

  5. initialize(AlgorithmParameterSpec params)
    描述:此方法用于使用指定参数集合初始化密钥对生成器。这允许更细粒度的控制密钥对的生成过程。
    参数:params - 密钥对生成所需的算法参数。
    注意:此方法将使用提供程序(以最高优先级安装)的SecureRandom实现作为随机源。

  6. initialize(AlgorithmParameterSpec params, SecureRandom random)
    描述:此方法结合了initialize(AlgorithmParameterSpec params)和initialize(int keysize, SecureRandom random)的功能,允许同时指定算法参数和随机源。
    参数:params - 密钥对生成所需的算法参数;random - 用于生成密钥对的随机源。

总结
KeyPairGenerator类提供了生成公钥和私钥对的功能,通过不同的getInstance方法可以选择不同的算法和提供者,通过initialize方法可以配置密钥大小和随机源等参数,最后通过generateKeyPair方法生成密钥对。

ConfigTools 加密与解密

  1. 读取配置文件
    描述:ConfigTools能够读取多种格式的配置文件,如JSON、YAML、INI和TOML等。这使得开发者可以方便地根据项目需求选择合适的配置文件格式。

  2. 解析配置文件
    描述:在读取配置文件后,ConfigTools会解析这些文件的内容,将其转换为程序可以理解的格式(如字典、对象等),以便进行后续的操作。

  3. 写入配置文件
    描述:ConfigTools支持将配置信息写入到文件中,支持多种格式。这允许开发者在需要时修改配置文件,或者将配置信息保存到文件中以便后续使用。

  4. 配置合并
    描述:ConfigTools可以将多个配置文件合并成一个,这对于模块化项目或者有层级结构的配置非常有用。它可以帮助开发者更好地组织和管理配置信息,避免配置文件的重复和混乱。

  5. 模板引擎集成
    描述:内置了简单的模板引擎,允许动态生成配置。这提供了灵活性,允许开发者根据环境变量或运行时参数动态地生成配置信息。

  6. 安全操作
    描述:在读写配置文件时,ConfigTools尊重权限,并提供了错误处理机制,确保操作的健壮性。这有助于防止因配置错误而导致的程序崩溃或安全问题。

  7. 开发环境支持
    描述:ConfigTools可以快速初始化项目配置,根据环境自动加载不同的配置文件。这有助于开发者在开发环境中更快地启动和测试项目。

  8. 持续集成/持续部署(CI/CD)支持
    描述:在自动化流程中,ConfigTools可以动态生成或更新配置,以适应不同阶段的需求。这有助于实现更高效的CI/CD流程。

  9. 微服务架构支持
    描述:在微服务架构中,每个服务可以有自己的配置,通过ConfigTools进行集中管理和版本控制。这有助于保持服务间配置的一致性,并简化配置的更新和部署过程。

  10. 服务器配置管理
    描述:ConfigTools可以批量更新或同步远程服务器的配置文件。这有助于维护大量服务器时的配置一致性,并减少手动操作的工作量。

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Spring Boot中,我们可以通过使用Druid和MyBatis来实现加密配置。下面是具体的实现步骤: 1. 首先,我们需要在项目的pom.xml文件中添加Druid和MyBatis依赖。示例如下: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> ``` 2. 在application.properties文件中配置Druid加密相关属性。示例如下: ```properties # 数据源配置 # 使用Druid数据源 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource # Druid连接池的相关配置 spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=enc:密文密码 # 配置Druid加密的配置项 # 使用ConfigFilter进行配置加密 spring.druid.configFilter.enabled=true # 加密的秘钥,自定义 spring.druid.configFilter.key=myKey ``` 其中,“spring.datasource.password”配置项的密码值使用了“enc:密文密码”的形式,表示密码已经进行了加密。需要注意的是,“密文密码”需要替换为真实的加密后的密码。 3. 创建一个自定义的PasswordCallbackFilter类,并继承com.alibaba.druid.filter.config.ConfigFilter类。在该类中,重写getConfigFrom(session)方法,并在方法中使用密码解密工具来解密加密密码。示例如下: ```java import com.alibaba.druid.filter.config.ConfigFilter; import java.util.Properties; public class PasswordCallbackFilter extends ConfigFilter { @Override protected Properties getConfigFrom(PhysicalConnectionInfo session) { Properties properties = super.getConfigFrom(session); // 解密密码 String encryptedPassword = properties.getProperty("password"); String decryptedPassword = PasswordUtil.decrypt(encryptedPassword); properties.setProperty("password", decryptedPassword); return properties; } } ``` 在上述代码中,我们通过配置文件中的spring.druid.configFilter.key属性来设置密码解密的秘钥。 4. 在启动类(即带有@SpringBootApplication注解的类)中,将自定义的PasswordCallbackFilter类加入到Druid的过滤器链中。示例如下: ```java import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class Application { @Value("${spring.druid.configFilter.key}") private String druidConfigFilterKey; @Bean public PasswordCallbackFilter passwordCallbackFilter() { PasswordCallbackFilter passwordCallbackFilter = new PasswordCallbackFilter(); passwordCallbackFilter.setConfigFilterKey(druidConfigFilterKey); return passwordCallbackFilter; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 在上述代码中,我们通过使用@Value注解来读取配置文件中的spring.druid.configFilter.key属性值,并将其设置到自定义的PasswordCallbackFilter对象中。 综上所述,我们通过这种方式,可以实现在Spring Boot项目中使用Druid和MyBatis进行密码加密配置的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖子S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值