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: 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)单元测试类:

	@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);
    }

执行后打印如下:

加密后的字串:+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=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 -Djasypt.encryptor.password=password -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar

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

jasypt:
    encryptor:
        password: ${JASYPT_ENCRYPTOR_PASSWORD:}

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

相关推荐

  1. SpringBoot使用Jasypt加密

    2024-07-20 14:34:01       18 阅读
  2. springboot整合jasypt对yml配置文件密码加密

    2024-07-20 14:34:01       55 阅读
  3. SpringBoot+Vue使用AES进行接口加密

    2024-07-20 14:34:01       44 阅读
  4. SpringBoot入门到精通-Spring Boot Jasypt Encrypt 演示

    2024-07-20 14:34:01       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 14:34:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 14:34:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 14:34:01       45 阅读
  4. Python语言-面向对象

    2024-07-20 14:34:01       55 阅读

热门阅读

  1. Linux 之 awk命令详解

    2024-07-20 14:34:01       18 阅读
  2. 电机线电流与转差率曲线理论推导

    2024-07-20 14:34:01       16 阅读
  3. 【HTTP 与 HTTPS 介绍与区别】

    2024-07-20 14:34:01       16 阅读
  4. (81)组合环路--->(05)避免组合环路

    2024-07-20 14:34:01       15 阅读
  5. 3.Implementing Controllers

    2024-07-20 14:34:01       15 阅读
  6. axios(ajax请求库)

    2024-07-20 14:34:01       13 阅读
  7. C++题目_中缀表达式转后缀表达式(常考)

    2024-07-20 14:34:01       19 阅读
  8. 差分进化(Differential Evolution)算法

    2024-07-20 14:34:01       20 阅读
  9. Cyclic Operations

    2024-07-20 14:34:01       16 阅读
  10. VScode如何进行调试

    2024-07-20 14:34:01       17 阅读
  11. 规范:需求管理规范

    2024-07-20 14:34:01       17 阅读