SpringBoot使用Jasypt加密

在我们的项目中,代码中经常会用到比如一些中间件,比如redis、mysql、云服务等一些账号和密码,以及一些key等,如果直接在配置文件中明文配置的话,会存在安全风险,这些明文配置的账号密码如果被一些安全软件进行漏洞扫描的话,通常也是不安全的,属于比较敏感的信息,为了保护这些敏感信息,就需要做脱敏处理。本文介绍的Jasypt就是对密码加密的一个工具。

Jasypt简介

Jasypt(Java Simplified Encryption)是一个简化Java加密操作的工具,它是一个开源的Java库,旨在帮助开发者以最小的努力添加基本的加密功能,同时无需深入了解密码学的工实现原理,对开发者比较友好。

官网:http://www.jasypt.org/

github地址:https://github.com/ulisesbocchio/jasypt-spring-boot
优点

  • 高安全性:采用密码学强度加密技术,支持多种加密算法,平衡了性能和安全性。
  • 配置灵活:支持自定义加密算法。
  • 支持多种数据类型:可以加密密码、文本、数字、二进制文件等多种文件类型。
  • 集成方便:可轻松与Spring框架及SpringSecurity集成,用于加密应用程序配置、数据库连接信息等,另外还可以与其他框架透明集成(如Hibernate等),方便在多种应用场景下使用。

SpringBoot集成Jasypt

1.依赖导入

xml 复制代码
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
  <groupId>com.github.ulisesbocchio</groupId>
  <artifactId>jasypt-spring-boot-starter</artifactId>
  <version>3.0.5</version>
</dependency>

2.加密密码生成

a.第一种:使用单元测试或者单独写一个main方法来获取

1)首先添加yml配置:

yaml 复制代码
jasypt:
  encryptor:
    # 加密的密钥,生成环境放到启动参数配置
    password: abc123465
    # 加密算法
    algorithm: PBEWithMD5AndDES
    iv-generator-classname: org.jasypt.iv.NoIvGenerator
    # 算法识别的前后缀,默认ENC()
    property:
      prefix: "ENC("
      suffix: ")"

参数注意点:

1)password为加解密的密钥

2)algorithm:采用的算法,它决定了如何将明文转换为密文以及如何将密文还原为明文,常用的对称加密算法比如:
PBEWithMD5AndDES:基于MD5哈希函数和DES加密标准的基于密码的加密(Password-Based Encryption, PBE)算法。这种算法使用密码作为加密密钥的生成基础,但需要注意的是,MD5和DES由于其较短的密钥长度和潜在的弱点,可能不再被认为是安全的。
PBEWITHHMACSHA512ANDAES_256:使用HMAC-SHA512哈希函数和AES-256加密算法的基于密码的加密算法。这种算法提供了更高的安全性,适用于需要更强加密保护的场景。

3)iv-generator-classname:生成初始化向量(IV)的类名,IV是某些加密算法(特别是某些模式下的AES等块加密算法)中使用的一个随机值,它与密钥一起用于加密过程,以增加加密的复杂性和安全性。对于不需要IV的加密算法(如PBEWithMD5AndDES),iv-generator-classname通常可以设置为org.jasypt.iv.NoIvGenerator,表示不使用IV。

官网给出的一些配置项如下:

Key Required Default Value
jasypt.encryptor.password True -
jasypt.encryptor.algorithm False PBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.key-obtention-iterations False 1000
jasypt.encryptor.pool-size False 1
jasypt.encryptor.provider-name False SunJCE
jasypt.encryptor.provider-class-name False null
jasypt.encryptor.salt-generator-classname False org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.iv-generator-classname False org.jasypt.iv.RandomIvGenerator
jasypt.encryptor.string-output-type False base64
jasypt.encryptor.proxy-property-sources False false
jasypt.encryptor.skip-property-sources False empty list

2)单元测试类:

java 复制代码
	@Autowired
    private StringEncryptor encryptor;

    @Test
    void jasyptTest() {
        String passwordEncrypt = encryptor.encrypt("2024zyf");
        System.out.println("加密后的字串:" + passwordEncrypt);
        String passwordDecrypt = encryptor.decrypt(passwordEncrypt);
        System.out.println("解密后的字串:" + passwordDecrypt);
    }

执行后打印如下:

java 复制代码
加密后的字串:+N0zcUfUHqVnS3X+XiWmLQ==
解密后的字串:2024zyf
b.第二种:使用命令行获取

可以使用java命令,在jasypt的jar包目录下执行

java 复制代码
java  -cp  jasypt-1.9.3.jar  org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="2024zyf" password=abc123465 algorithm=PBEWithMD5AndDES ivGeneratorClassName=org.jasypt.iv.NoIvGenerator

执行后生成如下:

java 复制代码
----ENVIRONMENT-----------------

Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.391-b13



----ARGUMENTS-------------------

ivGeneratorClassName: org.jasypt.iv.NoIvGenerator
algorithm: PBEWithMD5AndDES
input: 2024zyf
password: abc123465



----OUTPUT----------------------

74FROihl5lDzKLvl6siN8g==

对应解密命令如下:

java 复制代码
java  -cp  jasypt-1.9.3.jar  org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="上一步生成的加密密码" password=abc123465 algorithm=PBEWithMD5AndDES ivGeneratorClassName=org.jasypt.iv.NoIvGenerator

采用上面方式生成密文后,这样我们就可以把加密后的密码,写入我们的配置application.yml

java 复制代码
spring:
  datasource:
    url: jdbc:mysql://xxx:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: test
    password: ENC(+N0zcUfUHqVnS3X+XiWmLQ==)
    driver-class-name: com.mysql.cj.jdbc.Driver

这样ENC()内就是我们的密文,当应用启动的时候,jasypt会自动帮我们解密来连接数据库了。

注意点

jasypt的password值安全处理

将password直接硬编码在配置文件中(如application.properties或application.yml)可能会带来安全风险。因此,推荐的做法是通过环境变量、命令行参数或外部配置文件 等方式来提供password,以避免在源代码中泄露敏感信息。

我们可以如启动命令中,如下启动命令行:

java 复制代码
	java -Djasypt.encryptor.password=password -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar

或者使用yml配置外部的环境变量

java 复制代码
jasypt:
    encryptor:
        password: ${JASYPT_ENCRYPTOR_PASSWORD:}

参考:

1.jasypt 配置文件加解密

相关推荐
世间万物皆对象1 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
qq_17448285753 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
锅包肉的九珍3 小时前
Scala的Array数组
开发语言·后端·scala
心仪悦悦4 小时前
Scala的Array(2)
开发语言·后端·scala
2401_882727574 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
心仪悦悦4 小时前
Scala中的集合复习(1)
开发语言·后端·scala
代码小鑫5 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖5 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
激流丶5 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
周全全5 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php