当前位置: 首页 > article >正文

Jasypt 实现 yml 配置加密

文章目录

  • 前言
  • 一、集成 Jasypt
    • 1. pom 依赖
    • 2. yml 依赖
  • 3. 加密工具类
  • 3. 使用
  • 二、常见问题
    • 1. application.yml 失效问题
    • 2. 配置热更新失败问题


前言

jasypt 官方地址:https://github.com/ulisesbocchio/jasypt-spring-boot

Jasypt可以为Springboot加密的信息很多,主要有:

  1. System Property 系统变量。
  2. Envirnment Property 环境变量。
  3. Command Line argument 命令行参数。
  4. Application.properties 应用配置文件。
  5. Yaml properties 应用配置文件。
  6. other custom property sources 其它配置文件。

一、集成 Jasypt

1. pom 依赖

<!-- jasypt(yml加密) -->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

2. yml 依赖

jasypt:
  encryptor:
    password: encpassword # 加密盐值(自定义)
    algorithm: PBEWithMD5AndDES # 加密算法(3.0.5以下版本默认PBEWithMD5AndDES,即DES加密算法-32位密文;3.0.5及以上版本默认PBEWITHHMACSHA512ANDAES_256,即AES加密算法-64位密文)
    iv-generator-classname: org.jasypt.iv.NoIvGenerator # 加密偏移生成器

3. 加密工具类

使用如下工具类,对密码进行加密获取密文。

import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;

/**
 * jasypt(yml加密)工具
 *
 * @author whiteen
 * @date 2024-06-20 00:00:00
 */
@Slf4j
public class JasyptUtil {

    /**
     * DES加密
     *
     * @param original 待加密内容
     * @param password 加密盐值
     * @return 加密密文
     * @author whiteen
     * @date 2024-06-20 00:00:00
     */
    public static String encryptByDes(String original, String password) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        // 设置盐值
        config.setPassword(password);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
        encryptor.setConfig(config);
        // 加密
        return encryptor.encrypt(original);
    }

    /**
     * AES加密
     *
     * @param original 待加密内容
     * @param password 加密盐值
     * @return 加密密文
     * @author whiteen
     * @date 2024-06-20 00:00:00
     */
    public static String encryptByAes(String original, String password) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        // 设置盐值
        config.setPassword(password);
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        encryptor.setConfig(config);
        // 加密
        return encryptor.encrypt(original);
    }

    /**
     * DES解密
     *
     * @param original 待解密内容
     * @param password 加密盐值
     * @return 加密明文
     * @author whiteen
     * @date 2024-06-20 00:00:00
     */
    public static String decryptByDes(String original, String password) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        // 设置盐值
        config.setPassword(password);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
        encryptor.setConfig(config);
        // 解密
        return encryptor.decrypt(original);
    }

    /**
     * AES解密
     *
     * @param original 待解密内容
     * @param password 加密盐值
     * @return 加密明文
     * @author whiteen
     * @date 2024-06-20 00:00:00
     */
    public static String decryptByAes(String original, String password) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        // 设置盐值
        config.setPassword(password);
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        encryptor.setConfig(config);
        // 解密
        return encryptor.decrypt(original);
    }

    public static void main(String[] args) {
        // 待加密内容
        String original = "original";
        // 加密盐值
        String password = "encpassword";
        // DES加密
        String encryptedDes = encryptByDes(original, password);
        log.info("DES密⽂: {}", encryptedDes);
        // DES解密
        String decryptedDes = decryptByDes(encryptedDes, password);
        log.info("DES明⽂: {}", decryptedDes);
        // AES加密
        String encryptedAes = encryptByAes(original, password);
        log.info("AES密⽂: {}", encryptedAes);
        // AES解密
        String decryptedAes = decryptByAes(encryptedAes, password);
        log.info("AES明⽂: {}", decryptedAes);
    }

}

3. 使用

password: ENC(${ORACLE_PWD:password})

二、常见问题

1. application.yml 失效问题

如果你的项目存在 boostrap.yml 配置文件,在引入 jasypt-spring-boot-starter 之后,发现 application.yml 与 application-dev.yml 配置没有生效,需要在 boostrap.yml 中设置 jasypt.encryptor.bootstrap 属性为 false,禁用对 boostrap 配置文件的加密支持,就可以解决 application.yml 与 application-dev.yml 配置失效的问题。

说明:
当 jasypt 和 springcloud 一起使用时,bootstrap 的配置会失效。追踪代码发现,spring 在启动 bootstrap 容器后,当把 bootstrap 容器的 environment 合并到子容器时,只同步了 OriginTrackedMapPropertySource 类型 BootstrapApplicationListener,此时所有的 PropertySource 都已经被包装为 EncryptablePropertySourceWrapper,所以会导致 bootstrap 的配置不会合并到子容器。

2. 配置热更新失败问题

在 yml 配置文件中设置环境变量报错。

参考 apollo 跟 jasypt-spring-boot-2.1.0.jar 不兼容问题: https://github.com/apolloconfig/apollo/issues/2162

升级 jasypt-spring-boot-starter 到 3.0.5 及以上版本可以解决配置热更新问题,再新增 algorithm 和 iv-generator-classname 两个配置即可:

<!-- jasypt(yml加密) -->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
jasypt:
  encryptor:
    password: encpassword # 加密盐值(自定义)
      algorithm: PBEWithMD5AndDES # 加密算法(3.0.5以下版本默认PBEWithMD5AndDES,即DES加密算法-32位密文;3.0.5及以上版本默认PBEWITHHMACSHA512ANDAES_256,即AES加密算法-64位密文)
      iv-generator-classname: org.jasypt.iv.NoIvGenerator # 加密偏移生成器

这样就可以在 yml 配置文件中设置环境变量:

password: ENC(${ORACLE_PWD:BBO5rGF40i+Sg5oG36MT5aEwpdrOe5f2})

http://www.kler.cn/a/389137.html

相关文章:

  • PostgreSQL 开启密码验证插件
  • Debezium日常分享系列之:异步 Debezium 嵌入式引擎
  • 常用中间件介绍
  • 新的恶意软件活动通过游戏应用程序瞄准 Windows 用户
  • [ Linux 命令基础 3 ] Linux 命令详解-文件和目录管理命令
  • 重学SpringBoot3-整合 Elasticsearch 8.x (三)使用Repository
  • GPU集群上分布式训练大模型
  • Allure入门介绍
  • qt实现多影像的匀光调整
  • 网络层5——IPV6
  • Oracle 第26章:Oracle Data Guard
  • MySQL 数据备份与恢复
  • 智能检测技术与传感器(热电传感器四个定律)
  • 状态模式(State Pattern)详解
  • 构造,CF 2029D - Cool Graph
  • HBase的架构介绍,安装及简单操作
  • Python数据分析案例64——杭帮菜美食探索数据分析可视化
  • GIF图片格式详解(三)
  • 如何在 Spring Boot 中利用 RocketMQ 实现批量消息消费
  • Spark本地模式安装
  • MYSQL中的两种转义操作
  • Linux_调试器-gdb/cgdb的使用
  • 境内部署DIfy(上篇)
  • 软件工程中的创建型设计模式:工厂方法模式与抽象工厂模式
  • Java抽象类与接口
  • openresty入门教程:init_by_lua_block