HCRM博客

Jasypt 报错,如何有效解决并避免此类问题?

Jasypt报错全面解析

Jasypt(Java Simplified Encryption)是一个用于加密和解密数据库敏感信息的工具,在SPRing Boot应用中广泛使用,在使用过程中,开发者可能会遇到各种报错问题,本文将详细解析这些常见错误并提供解决方案。

Jasypt 报错,如何有效解决并避免此类问题?-图1
(图片来源网络,侵权删除)

一、Jasypt版本与算法不匹配

1. 原因及解决方法

在使用Jasypt进行加密时,不同版本的Jasypt默认使用的算法可能不同,Jasypt 3.0以上版本默认使用PBEWITHHMACSHA512ANDAES_256算法,而3.0以下版本则使用PBEWithMD5AndDES算法,如果加密和解密时使用的算法不一致,就会导致解密失败。

解决方法:确保加解密时使用的算法一致,可以选择统一使用PBEWITHHMACSHA512ANDAES_256算法,或者统一使用PBEWithMD5AndDES算法。

2. 示例代码

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
public class JasyptUtil {
    /**
     * Jasypt生成加密结果
     * @param password 配置文件中设定的加密盐值
     * @param value 加密值
     * @return
     */
    public static String encyptPwd(String password, String value) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password);
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        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);
        return encryptor.encrypt(value);
    }
    /**
     * 解密
     * @param password 配置文件中设定的加密盐值
     * @param value 解密密文
     * @return
     */
    public static String decyptPwd(String password, String value) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password);
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        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);
        return encryptor.decrypt(value);
    }
    public static void main(String[] args) {
        // 加密
        String encPwd = encyptPwd("jasypt", "root");
        // 解密
        String decPwd = decyptPwd("jasypt", encPwd);
        System.out.println("加密后的密文:" + encPwd);
        System.out.println("解密后的明文:" + decPwd);
    }
}

二、Boot版本与Jasypt兼容性问题

1. 原因及解决方法

不同版本的Spring Boot对Jasypt的支持情况不同,Jasypt 2.1.x版本对应Spring Boot 2.1.x版本,而Jasypt 3.0.x版本则对应Spring Boot 2.2.x及以上版本,如果不匹配,可能会导致启动报错。

Jasypt 报错,如何有效解决并避免此类问题?-图2
(图片来源网络,侵权删除)

解决方法:确保Spring Boot版本与Jasypt版本兼容,可以通过查阅官方文档或相关资源确认兼容性。

2. 示例配置

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasyptspringbootstarter</artifactId>
    <version>3.0.3</version>
</dependency>

三、密码设置错误导致IllegalArgumentException

1. 原因及解决方法

在使用Jasypt时,如果在application.yml中配置了错误的密码或未正确设置密码,会抛出IllegalArgumentException: Password cannot be set empty异常,这通常是因为直接复制了别人的密文而没有重新生成自己的密文。

解决方法:确保在application.yml中正确配置了密码,并且密码是通过Jasypt工具生成的,可以使用命令行工具生成密文:

Jasypt 报错,如何有效解决并避免此类问题?-图3
(图片来源网络,侵权删除)
java cp jasypt1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=salt algorithm=PBEWithMD5AndDES

2. 示例配置

spring:
  datasource:
    driverclassname: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jpa?useUnicode=true&useSSL=true&serverTimezone=GMT%2B8
    username: ENC(hEc7NPysxK/gIxN1r6iogy/sadZhFkBLLm+gr55CQKC0nBgCSJXEyU9PmsGi1Li3)
    password: ENC(MaF3AwPysxK/gIxN1r6iogy/sadZhFkBLLm+gr55CQKC0nBgCSJXEyU9PmsGi1Li3)

在使用Jasypt进行数据库敏感信息加密时,开发者可能会遇到多种报错问题,通过本文的详细解析,可以发现大多数问题源于版本不匹配、算法不一致或配置错误,确保使用正确的版本、统一的算法以及正确的配置,可以有效避免这些问题,建议开发者在实际应用中仔细阅读官方文档,并根据具体需求进行调整,以下是两个常见问题的FAQs:

Q1:为什么使用Jasypt加密后的数据无法解密?

A1: 可能是由于加密和解密时使用的算法不一致,确保在加密和解密时都使用相同的算法,如PBEWITHHMACSHA512ANDAES_256PBEWithMD5AndDES

Q2:如何解决Spring Boot启动时因密码配置错误导致的IllegalArgumentException?

A2: 确保在application.yml中正确配置了密码,并且密码是通过Jasypt工具生成的,避免直接复制别人的密文,而是使用命令行工具或代码生成自己的密文。

本站部分图片及内容来源网络,版权归原作者所有,转载目的为传递知识,不代表本站立场。若侵权或违规联系Email:zjx77377423@163.com 核实后第一时间删除。 转载请注明出处:https://blog.huochengrm.cn/gz/19564.html

分享:
扫描分享到社交APP
上一篇
下一篇