在我们的项目中,代码中经常会用到比如一些中间件,比如redis、mysql、云服务等一些账号和密码,以及一些key等,如果直接在配置文件中明文配置的话,会存在安全风险,这些明文配置的账号密码如果被一些安全软件进行漏洞扫描的话,通常也是不安全的,属于比较敏感的信息,为了保护这些敏感信息,就需要做脱敏处理。本文介绍的Jasypt就是对密码加密的一个工具。
Jasypt简介
Jasypt(Java Simplified Encryption)是一个简化Java加密操作的工具,它是一个开源的Java库,旨在帮助开发者以最小的努力添加基本的加密功能,同时无需深入了解密码学的工实现原理,对开发者比较友好。
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:}
参考: