springboot jasypt2.x与jasypt3.x的使用方式

 更新时间:2024年09月29日 14:49:20   作者:头未秃  
在软件开发中,将配置文件中的敏感信息(如数据库密码)进行加密是保障安全的有效手段,jasypt框架提供了这一功能,支持通过加密工具类或命令行工具生成密文,并通过修改配置文件和启动参数的方式使用密文和密钥,这样即便配置文件被泄露

1、前言

如果我们把大量的配置信息都放在配置文件中是会有安全隐患的,那么如何消除这个隐患呢?

最直接的方式就是把配置信息中的一些敏感信息(比如数据库密码、中间件密码)加密,然后程序在获取这些配置的时候解密,就可以达到目的。

这个时候,jasypt框架就派上用场了。

2.x 版本的分析

如果引入的是 2.x 的版本,启动信息如下:

String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor
Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWithMD5AndDES
Encryptor config not found for property jasypt.encryptor.key-obtention-iterations, using default value: 1000
Encryptor config not found for property jasypt.encryptor.pool-size, using default value: 1
Encryptor config not found for property jasypt.encryptor.provider-name, using default value: null
Encryptor config not found for property jasypt.encryptor.provider-class-name, using default value: null
Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator
Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.NoIvGenerator
Encryptor config not found for property jasypt.encryptor.string-output-type, using default value: base64

通过以上信息的解读,我们可以了解到的信息如下:

默认加密算法:PBEWithMD5AndDES
默认的迭代次数: 1000
默认池大小: 1
默认生成盐的类:org.jasypt.salt.RandomSaltGenerator
默认IV生成器类:org.jasypt.iv.NoIvGenerator
默认输出类型:base64

3.x 版本分析

如果引入的是 3.x 的版本,启动信息如下:

String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor
Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWITHHMACSHA512ANDAES_256
Encryptor config not found for property jasypt.encryptor.key-obtention-iterations, using default value: 1000
Encryptor config not found for property jasypt.encryptor.pool-size, using default value: 1
Encryptor config not found for property jasypt.encryptor.provider-name, using default value: null
Encryptor config not found for property jasypt.encryptor.provider-class-name, using default value: null
Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator
Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.RandomIvGenerator
Encryptor config not found for property jasypt.encryptor.string-output-type, using default value: base64

通过以上信息的解读,我们可以了解到的信息如下:

默认加密算法:PBEWITHHMACSHA512ANDAES_256
默认的迭代次数: 1000
默认池大小: 1
默认生成盐的类:org.jasypt.salt.RandomSaltGenerator
默认IV生成器类:org.jasypt.iv.RandomIvGenerator
默认输出类型:base64

2、使用

1. 引入pom包

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

2. 创建加密工具类生成密码

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;

/**
 * Jasyp加解密工具类
 * @author chenxc
 * @date 2020/4/14 14:28
 */
public class JasypUtil {

    private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";

    private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";

    /**
     * Jasyp2.x 加密(PBEWithMD5AndDES)
     * @param		 plainText      待加密的原文
     * @param		 factor         加密秘钥
     * @return       java.lang.String
     */
    public static String encryptWithMD5(String plainText, String factor) {
        // 1. 创建加解密工具实例
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        // 2. 加解密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm(PBEWITHMD5ANDDES);
        config.setPassword(factor);
        encryptor.setConfig(config);
        // 3. 加密
        return encryptor.encrypt(plainText);
    }

    /**
     * Jaspy2.x 解密(PBEWithMD5AndDES)
     * @param		 encryptedText      待解密密文
     * @param		 factor             解密秘钥
     * @return       java.lang.String
     */
    public static String decryptWithMD5(String encryptedText, String factor) {
        // 1. 创建加解密工具实例
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        // 2. 加解密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm(PBEWITHMD5ANDDES);
        config.setPassword(factor);
        encryptor.setConfig(config);
        // 3. 解密
        return encryptor.decrypt(encryptedText);
    }

    /**
     * Jasyp3.x 加密(PBEWITHHMACSHA512ANDAES_256)
     * @param		 plainText  待加密的原文
     * @param		 factor     加密秘钥
     * @return       java.lang.String
     */
    public static String encryptWithSHA512(String plainText, String factor) {
        // 1. 创建加解密工具实例
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        // 2. 加解密配置
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(factor);
        config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
        // 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置
        config.setKeyObtentionIterations( "1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        // 3. 加密
        return encryptor.encrypt(plainText);
    }

    /**
     * Jaspy3.x 解密(PBEWITHHMACSHA512ANDAES_256)
     * @param		 encryptedText  待解密密文
     * @param		 factor         解密秘钥
     * @return       java.lang.String
     */
    public static String decryptWithSHA512(String encryptedText, String factor) {
        // 1. 创建加解密工具实例
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        // 2. 加解密配置
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(factor);
        config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
        // 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置
        config.setKeyObtentionIterations( "1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        // 3. 解密
        return encryptor.decrypt(encryptedText);
    }

    public static void main(String[] args) {
        String factor = "salt";
        String plainText = "123456";
        String encryptWithMD5Str = encryptWithMD5(plainText, factor);
        String decryptWithMD5Str = decryptWithMD5(encryptWithMD5Str, factor);

        String encryptWithSHA512Str = encryptWithSHA512(plainText, factor);
        String decryptWithSHA512Str = decryptWithSHA512(encryptWithSHA512Str, factor);
        System.out.println("采用MD5加密前原文密文:" + encryptWithMD5Str);
        System.out.println("采用MD5解密后密文原文:" + decryptWithMD5Str);
        System.out.println();
        System.out.println("采用SHA512加密前原文密文:" + encryptWithSHA512Str);
        System.out.println("采用SHA512解密后密文原文:" + decryptWithSHA512Str);
    }
}

也可以调用jasypt-1.9.2.jar包中一个main方法:org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI

注:jasypt2.x版本可以使用,3.x不能使用

找到maven仓库中的 jasypt-1.9.2.jar(路径是:xxx\repository\org\jasypt\jasypt\1.9.2)

java -cp jasypt-1.9.2.jar  org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="test" password=salt algorithm=PBEWithMD5AndDES
  • -- input参数:你想要加密的密码
  • -- password参数:jasypt用来加密你的密码的密码
  • -- algorithm加密方式:使用默认就好了

结果如下图,途中的output就是加密后的密文了。

3. 修改配置文件,把配置文件中要加密的字段改为:ENC(密文)

yml中添加

system:
  mysql:
    url: xxx.xxx.xx.xx
    username: username
    password: ENC(EM4fA1YBhd8OTcdl93w2QQ==)

jasypt:
  encryptor:
    password: salt

那么新的问题又来了,你把密码盐放在配置文件中,这些密码加密就相当于没加密

5、将加密密钥作为启动运行参数

以上我们的密钥也是保存在配置文件中的,一旦密钥泄露,信息被解密,安全隐患依然存在!

因此我们可以通过将密钥设置为程序启动时的参数来避免!!!

java -Djasypt.encryptor.password=salt -jar test.jar

idea中如下配置运行:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Liquibase 在 Spring Boot 中的使用详细介绍

    Liquibase 在 Spring Boot 中的使用详细介绍

    Liquibase 提供了灵活的变更集机制,支持创建表、修改列、填充数据、回滚变更等多种操作,本文将通过多个丰富的示例,详细讲解如何在 Spring Boot项目中使用 Liquibase,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • 详解Mybatis内的mapper方法为何不能重载

    详解Mybatis内的mapper方法为何不能重载

    这篇文章主要介绍了详解Mybatis内的mapper方法为何不能重载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • jenv实现mac下多版本jdk管理以及切换方式

    jenv实现mac下多版本jdk管理以及切换方式

    文章介绍在Mac上使用jenv管理多版本JDK的方法,包括下载安装指定JDK版本、配置环境变量及切换操作,同时说明Maven和IDEA的JDK配置步骤,确保不同项目使用正确版本,涉及路径设置、项目SDK及Maven参数配置
    2025-08-08
  • Java中ThreadLocal共享变量的使用

    Java中ThreadLocal共享变量的使用

    java.lang.ThreadLocal该类提供了线程局部变量,用于在当前线程中共享数据,本文主要介绍了Java中ThreadLocal共享变量的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • java多线程编程之Synchronized块同步方法

    java多线程编程之Synchronized块同步方法

    这篇文章主要介绍了java多线程编程之Synchronized块同步方法,synchronized关键字又称同步锁,当方法执行完后,会自动释放锁锁,只有一个线程能进入此方法,看看下文中各种例子对synchronized的详细解释
    2015-12-12
  • Java如何处理图片保存之后变红色的问题

    Java如何处理图片保存之后变红色的问题

    这篇文章主要介绍了Java如何处理图片保存之后变红色的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Spark Maven项目打包后找不到主类问题及解决

    Spark Maven项目打包后找不到主类问题及解决

    在使用IDEA、Maven创建Spark项目时,遇到打包后Scala程序找不到主类的问题,原因是Maven缺少scala-maven-plugin插件,通过添加该插件并重新构建项目,问题得到解决
    2026-02-02
  • 简单理解Java的垃圾回收机制与finalize方法的作用

    简单理解Java的垃圾回收机制与finalize方法的作用

    这篇文章主要介绍了简单理解Java的垃圾回收机制与finalize方法的作用,着重讲解了Java的GC销毁对象的过程,需要的朋友可以参考下
    2015-11-11
  • JAVA图片水印开发案例详解

    JAVA图片水印开发案例详解

    水印开发是web开发中一种比较常见的功能,实现的代码很简单,这篇文章主要介绍了JAVA图片水印开发案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Java的List集合中泛型使用详解

    Java的List集合中泛型使用详解

    这篇文章主要介绍了Java的List集合中泛型使用详解,泛型类,如果没有指定具体的数据类型,此时,操作类型是Object,泛型的类型参数只能是类类型,不能是基本数据类型,需要的朋友可以参考下
    2023-12-12

最新评论