您的位置:首页 > 教育 > 锐评 > SpringBoot使用Jasypt加密

SpringBoot使用Jasypt加密

2024/10/6 5:53:27 来源:https://blog.csdn.net/zhangyifang_009/article/details/140569945  浏览:    关键词: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.依赖导入

<!-- 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配置:

jasypt:encryptor:# 加密的密钥,生成环境放到启动参数配置password: abc123465# 加密算法algorithm: PBEWithMD5AndDESiv-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。

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

KeyRequiredDefault Value
jasypt.encryptor.passwordTrue-
jasypt.encryptor.algorithmFalsePBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.key-obtention-iterationsFalse1000
jasypt.encryptor.pool-sizeFalse1
jasypt.encryptor.provider-nameFalseSunJCE
jasypt.encryptor.provider-class-nameFalsenull
jasypt.encryptor.salt-generator-classnameFalseorg.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.iv-generator-classnameFalseorg.jasypt.iv.RandomIvGenerator
jasypt.encryptor.string-output-typeFalsebase64
jasypt.encryptor.proxy-property-sourcesFalsefalse
jasypt.encryptor.skip-property-sourcesFalseempty list

2)单元测试类:

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

执行后打印如下:

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

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

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

执行后生成如下:

----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  -cp  jasypt-1.9.3.jar  org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="上一步生成的加密密码" password=abc123465 algorithm=PBEWithMD5AndDES ivGeneratorClassName=org.jasypt.iv.NoIvGenerator

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

spring:datasource:url: jdbc:mysql://xxx:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: testpassword: ENC(+N0zcUfUHqVnS3X+XiWmLQ==)driver-class-name: com.mysql.cj.jdbc.Driver

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

注意点

jasypt的password值安全处理

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

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

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

jasypt:encryptor:password: ${JASYPT_ENCRYPTOR_PASSWORD:}

参考:
1.jasypt 配置文件加解密

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com