java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot Jasypt加密、解密

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

作者: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加密、解密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文