JAVA(SpringBoot)集成Jasypt进行加密、解密功能

 更新时间:2024年09月25日 09:27:32   作者:cccl.  
Jasypt是一个Java库,专门用于简化加密和解密操作,提供多种加密算法支持,集成到SpringBoot等框架中,通过使用Jasypt,可以有效保护配置文件中的敏感信息,如数据库密码等,避免被未授权访问,Jasypt还支持自定义加密器,提高扩展性和安全性,适用于各种需要加密保护应用场景

一、Jasypt 简介

1、Jasypt 是一个 Java 库,用于简化加密和解密任务。它提供了方便的 API,可以轻松地对字符串进行加密,并在需要时进行解密。
2、保护敏感配置信息:在配置文件中存储敏感信息时,使用加密可以防止这些信息被未经授权的人员访问。
3、灵活的加密方式:Jasypt 支持多种加密算法和配置选项,可以根据具体需求进行定制。
4、与 Spring Boot 集成方便:可以通过简单的配置将 Jasypt 集成到 Spring Boot 应用中,无需大量的额外代码。

二、Jasypt功能

(1)、加密和解密

字符串加密:
可以对敏感的字符串信息进行加密,如数据库密码、API 密钥、用户密码等。通过指定加密算法和密钥,可以将明文转换为密文,保护敏感信息不被轻易获取。例如,可以使用 Jasypt 加密数据库连接密码,然后在应用程序中使用加密后的密码进行数据库连接,确保密码的安全性。

(2)、密钥管理

密钥生成:
Jasypt 可以生成加密密钥,确保密钥的随机性和安全性。密钥的生成可以基于不同的算法和参数,以满足不同的安全需求。
密钥存储和检索:
Jasypt 提供了多种方式来存储和检索加密密钥。可以将密钥存储在环境变量、配置文件、数据库或其他安全存储中。在应用程序中,可以通过指定密钥存储的位置和方式来获取加密密钥。

(3)、加密算法支持

多种加密算法:
Jasypt 支持多种加密算法,如 AES、DES、RSA 等。可以根据不同的安全需求选择合适的加密算法。
算法参数配置:
Jasypt 允许对加密算法的参数进行配置,如密钥长度、迭代次数、盐值等。这些参数可以根据具体的安全需求进行调整,以提高加密的强度。

(4)、集成和扩展性

与框架集成:
Jasypt 可以与各种 Java 框架集成,如 Spring、Spring Boot、Hibernate 等。可以在这些框架中使用 Jasypt 进行加密和解密操作,保护框架配置文件和敏感信息。
自定义加密器:
Jasypt 提供了自定义加密器的接口,可以根据特定的需求实现自己的加密算法和逻辑。这使得 Jasypt 具有很高的扩展性,可以满足不同应用场景的加密需求。

三、依赖配置

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

四、配置Jasypt

#配置文件加密
jasypt:
encryptor:
  # 秘钥(用于加密和解密的密码,需妥善保管,确保安全性)
  # 这里的秘钥一般不会写在配置文件中,为了方便理解暂时放在这里
  password: GrZGCCeUwLJ
  # 指定加密算法为基于密码的加密,结合了 HMAC-SHA512 和 AES-256,提供较强的加密强度
  algorithm: PBEWITHHMACSHA512ANDAES_256
  # 在生成加密密钥时的迭代次数,更多的迭代次数通常会增加密钥的安全性,但也会增加计算时间
  key-obtention-iterations: 100
  # 资源池的大小相关
  pool-size: 1
  # 指定用于生成初始化向量(IV)的类为随机初始化向量生成器,增加加密安全性
  iv-generator-classname: org.jasypt.iv.RandomIvGenerator
  # 指定用于生成盐(salt)的类为随机盐生成器,增加加密安全性
  salt-generator-classname: org.jasypt.salt.RandomSaltGenerator
  # 指定加密后的字符串输出格式为 Base64 编码,方便存储和传输
  string-output-type: base64
  property:
    # 加密属性值的前缀,用于标识加密的属性
    prefix: TEST(
    # 加密属性值的后缀,用于标识加密的属性
    suffix: )      

五、方案示例

(1)、创建SpringBootConfigEncrypt 实现 CommandLineRunner接口 项目启动时执行加密测试

import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class SpringBootConfigEncrypt implements CommandLineRunner {
    @Autowired
    private ApplicationContext applicationContext;
    /**
     * 自动注入 Jasypt 的字符串加密器,用于加密和解密操作。
     */
    @Autowired
    private StringEncryptor encryptor;
    @Override
    public void run(String... args) throws Exception {
        Environment environment = applicationContext.getBean(Environment.class);
        // 获取配置文件中数据库用户名和密码的原始明文。
        String oldUserName = environment.getProperty("spring.datasource.druid.test.username");
        String oldPassword = environment.getProperty("spring.datasource.druid.test.password");
        // 对用户名和密码进行加密。
        String encryptUserName = encrypt(oldUserName);
        String encryptPassword = encrypt(oldPassword);
        // 打印加密前后的结果对比
        System.out.println("MySQL原始明文密码为:" + oldUserName);
        System.out.println("MySQL原始明文密码为:" + oldPassword);
        System.out.println("*********************************************");
        System.out.println("MySQL原始明文密码加密后的结果为:" + encryptUserName);
        System.out.println("MySQL原始明文密码加密后的结果为:" + encryptPassword);
    }
    /**
     * 使用加密器对给定的字符串进行加密。
     *
     * @param originPassord 待加密的原始密码。
     * @return 加密后的字符串。
     */
    private String encrypt(String originPassord) {
        return encryptor.encrypt(originPassord);
    }
    /**
     * 使用加密器对给定的加密字符串进行解密。
     *
     * @param encryptedPassword 待解密的加密密码。
     * @return 解密后的字符串。
     */
    private String decrypt(String encryptedPassword) {
        return encryptor.decrypt(encryptedPassword);
    }
}

(2)、运行项目,控制台打印:

(3)、将配置文件中的明文替换为加密后的

更换完成之后,重新启动项目如果重启成功则加密完成。

(4)、TEST()介绍

这里的 “TEST” 有何特殊含义呢?实际上,使用 “TEST()” 来包裹加密密钥是一种约定俗成的表示方式。这样做的目的是为了明确标识出被加密的内容,使得在读取和处理配置文件时能够更容易地识别出加密字段。“TEST” 本身并没有特定的硬性规定的含义,它只是作为一种标记,让系统知道其中的内容是经过加密处理的。
如果想要自定义前后缀标记,比如将其换成 “ENCRYPT()” 来标记加密字段,此时只需要在配置文件中进行如下配置即可:

4.1修改 jasypt.encryptor.property.prefix 属性

4.2 修改数据库配置 username、password属性

以上第一种方案就算完成了。

注意密钥不要写在配置文件中上述方式仍存在加密密钥泄露的风险,可以将密钥从配置文件中移除,使用以下三种方式:

方式一:直接以程序启动时的命令行参数形式带入。
示例:java -jar app.jar --jasypt.encryptor.password=ENCRYPT。
方式二:直接以程序启动时的应用环境变量形式带入。
示例:java -Djasypt.encryptor.password=ENCRYPT-jar app.jar。
方式三:作为系统环境变量的方式来带入
1.打开全局配置文件:      sudo vim /etc/profile
2.编辑全局配置文件:      export JASYPT_ENCRYPT_PASSWORD=ENCRYPT
3.重载profile配置文件:  source /etc/profile
4.修改jasypt.encryptor.password属性
jasypt:
  encryptor:
    password: ${JASYPT_ENCRYPT_PASSWORD}

到此这篇关于JAVA(SpringBoot)集成Jasypt进行加密、解密功能的文章就介绍到这了,更多相关SpringBoot Jasypt加密、解密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在Java项目中实现日志输出的技巧分享

    在Java项目中实现日志输出的技巧分享

    日志是开发过程中不可或缺的一部分,它可以帮助我们追踪代码的执行过程、排查问题以及监控系统运行状况,然而,大多数开发人员在编写日志时往往只关注于输出必要的信息,而忽略了日志的可读性和美观性,本文将介绍如何在Java项目中实现漂亮的日志输出
    2023-10-10
  • Mybatis plus 配置多数据源的实现示例

    Mybatis plus 配置多数据源的实现示例

    这篇文章主要介绍了Mybatis plus 配置多数据源的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java网络编程之UDP网络通信详解

    Java网络编程之UDP网络通信详解

    这篇文章主要为大家详细介绍了Java网络编程中的UDP网络通信的原理与实现,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-09-09
  • 聊聊maven与jdk版本对应关系

    聊聊maven与jdk版本对应关系

    这篇文章主要介绍了maven与jdk版本对应关系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java怎样动态获取泛型参数的类型

    java怎样动态获取泛型参数的类型

    在Java中,泛型信息在编译时会被擦除,但可以通过特定API获取运行时的泛型参数类型,主要API包括Class的getGenericSuperclass()和getGenericInterfaces()方法,以及ParameterizedType的getActualTypeArguments()方法
    2024-09-09
  • java异步调用的4种实现方法

    java异步调用的4种实现方法

    日常开发中,会经常遇到说,前台调服务,本文主要介绍了java异步调用的4种实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 使用FeignClient进行微服务交互方式(微服务接口互相调用)

    使用FeignClient进行微服务交互方式(微服务接口互相调用)

    这篇文章主要介绍了使用FeignClient进行微服务交互方式(微服务接口互相调用),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java中获取MongoDB连接的方法详解

    Java中获取MongoDB连接的方法详解

    这篇文章主要介绍了Java中获取MongoDB连接的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java线程中的关键字和方法示例详解

    Java线程中的关键字和方法示例详解

    这篇文章主要介绍了Java有关线程中的关键字和方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Spring Boot使用yml格式进行配置的方法

    Spring Boot使用yml格式进行配置的方法

    很多springboot项目使用的是yml格式,主要目的是方便对读懂其他人的项目,下面小编通过本文给大家分享Spring Boot使用yml格式进行配置的方法,需要的朋友参考下吧
    2018-04-04

最新评论