SpringBoot中使用jasypt加解密配置文件

SpringBoot中使用jasypt加解密配置文件

在我们的服务中不可避免的需要使用到一些秘钥(数据库、redis等)

开发和测试环境还好,但生产如果采用明文配置讲会有安全问题,jasypt是一个通用的加解密库

1、POM依赖

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.2</version>
</dependency>

2、加解密配置文件

@Configuration
public class EncryptorConfig {
  
  @Bean
  public static EnvironmentStringPBEConfig config() {
    EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
    config.setPasswordEnvName("APP_ENCRYPTION_PASSWORD");
    config.setAlgorithm("PBEWithMD5AndDES");
    config.setKeyObtentionIterations("1000");
    config.setPoolSize("1");
    config.setProviderName("SunJCE");
    config.setPassword("test@salt");
    config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
    config.setStringOutputType("base64");
    return config;
  }
  
  @Bean
  public static PooledPBEStringEncryptor encryptor() {
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    encryptor.setConfig(config());
    return encryptor;
  }
}

3、项目配置文件application.yaml

spring:
  datasource:
    # MySQL 驱动
    driver-class-name: com.mysql.jdbc.Driver
    # 阿里 Druid 数据源连接池
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/test_db?useSSL=false&useUnicode=true&characeterEncoding=utf8
    # 数据库账号-密文配置将秘闻包裹在 ENC() 内, 如何获取密文请看下文
    username: ENC(EPJY8wqIzdyXELQGx7QvLQ==)
    # 数据库密码-密文配置将秘闻包裹在 ENC() 内, 如何获取密文请看下文
    password: ENC(14f8yv1Xe1ZqwxaFw4pRwftLl/1fLaCx)

以上配置完成后项目启动时就会自动读取配置文件中的密文账号和密码自动解密。

那么密文怎么得到的呢?


这里提供两种方式:

方式一:main方法获取

1、main方法代码

public class JasyptStringEncryptorDemo {
  
  public static void main() {
    // 加解密工具
    StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
    // 加解密配置
    EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
		// 配置加解密方式 与‘加解密配置文件’中的加解密方式一致
    config.setAlgorithm("PBEWithMD5AndDES");
    // 配置加解密盐值 与‘加解密配置文件’中的加解密盐值一致
    config.setPassword("test@salt");
    // 应用配置
    encryptor.setConfig(config);
    
    // 加密
    encryption(encryptor, "root"); //账号加密
    encryption(encryptor, "Bingo@1234"); // 密码加密
    
    // 解密
    decrypt(encryptor, "EPJY8wqIzdyXELQGx7QvLQ=="); // 账号解密验证
    decrypt(encryptor, "14f8yv1Xe1ZqwxaFw4pRwftLl/1fLaCx"); // 密码解密验证
  }
  
  /**
   * Jasypt 加密
   * @param encryptor 加解密工具
   * @param plaintext 需要加密的字符串
   **/
  public static void encryption(StandardPBEStringEncryptor encryptor, String plaintext) {
    String ciphertext = encryptor.encrypt(plaintext);
    System.out.println(plaintext + " : " + ciphertext);
  }
  
  /**
   * Jasypt 解密
   * @param encryptor 加解密工具
   * @param ciphertext 需要解密的字符串
   **/
  public static void decrypt(StandardPBEStringEncryptor encryptor, String ciphertext) {
    String plaintext = encryptor.decrypt(ciphertext);
    System.out.println(ciphertext + " : " + plaintext);
  }
}

2、运行结果

root : EPJY8wqIzdyXELQGx7QvLQ==
Bingo@1234 : 14f8yv1Xe1ZqwxaFw4pRwftLl/1fLaCx

EPJY8wqIzdyXELQGx7QvLQ== : root
14f8yv1Xe1ZqwxaFw4pRwftLl/1fLaCx : Bingo@1234

方式二:命令行方式获取

1、进入到我们的maven仓库中jasypt的jar包目录

cd C:\Users\bingo\.m2\repository\org\jasypt\jasypt\1.9.3

2、运行CMD命令加密

java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password="test@salt" algorithm=PBEWithMD5AndDES

3、运行结果

----ENVIRONMENT----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.161-b12

----ARGUMENTS------------------
algorithm: PBEWithMD5AndDES
input: root
password: test@salt

----OUTPUT---------------------

说明:input 输入要加密的明文账号或密码

password 输入‘加解密配置文件’中的盐值

algorithm 输入‘加解密配置文件’中的加解密方式

OUTPUT 最后输出的结果就是账号或密码的密文,直接填入项目配置文件对应的 ENC() 内即可

posted on 2021-05-28 11:27  DsyO  阅读(802)  评论(0)    收藏  举报

导航