当前位置: 首页 > news >正文

Springboot采用jasypt加密配置

目录

前言

一、Jasypt简介

二、运用场景

三、整合Jasypt

2.1.环境配置

2.2.添加依赖

2.3.添加Jasypt配置

2.4.编写加/解密工具类

2.5.自定义加密属性前缀和后缀

2.6.防止密码泄露措施

2.61.自定义加密器

2.6.2通过环境变量指定加密盐值

总结


前言

   在以往的多数项目中,配置文件中的数据库密码、redis密码、nacos密码等敏感性信息一般是以明文形式存在,存在泄露的风险,因此,对敏感信息加固是很有必要,加固的一个重要环节就是对重要信息做加密处理。

这里简单的介绍一下Jasypt加密

一、Jasypt简介

Jasypt 是一个 java 库,可以使开发者不需要太多操作来给 Java 项目添加基本加密功能,而且不需要知道加密原理。Jasypt 为开发人员提供了一种简单易用加密功能,包括:密码认证、字符串加密等。

二、运用场景

一般来说,项目配置文件里,所有涉及信息安全的配置项(或字段)都应该做处理,典型的比如:

  • 数据库密码,如mysql、oracle
  • 缓存中间件的密码,如 redis、mongodb
  • 其他中间件,如消息中间件、zk、nacos等
  • 第三方服务的,如appid、 Access_Key

三、整合Jasypt

官方示例:GitHub - ulisesbocchio/jasypt-spring-boot-samples: Sample apps using jasypt-spring-boot

2.1.环境配置

  • SpringBoot 2.0以上
  • Jasypt 3.0.5
  • jdk1.8

2.2.添加依赖

在项目 pom.xml 添加 Jasypt 相关依赖。

<!-- 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.3.添加Jasypt配置

jasypt:encryptor:password: 123456algorithm: PBEWITHHMACSHA512ANDAES_256iv-generator-classname: org.jasypt.iv.RandomIvGeneratorsalt-generator-classname: org.jasypt.salt.RandomSaltGeneratorstring-output-type: base64provider-name: SunJCEpool-size: 1key-obtention-iterations: 1000property:# 标识为加密属性的前缀prefix: ENC(# 标识为加密属性的后缀suffix: )

2.4.编写加/解密工具类

package com.bexk.util;import java.util.Base64;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;/*** @Description: 加解密密算法* @Author developer* @Date 2024/10/11 9:48 上午*/
public class JasyptUtil {/*** PBE 算法*/public static final String PBE_ALGORITHMS_MD5_DES = "PBEWITHMD5ANDDES";public static final String PBE_ALGORITHMS_SHA512_AES_256 = "PBEWithHMACSHA512ANDAES_256";private JasyptUtil() {}/*** 加密** @param encryptedStr 加密字符串* @param password     盐值* @return*/public static String encrypt(String encryptedStr, String password) {return encrypt(encryptedStr, PBE_ALGORITHMS_MD5_DES, password);}/*** 加密** @param encryptedStr 加密字符串* @param algorithm    加密算法* @param password     盐值* @return*/public static String encrypt(String encryptedStr, String algorithm, String password) {        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();EnvironmentPBEConfig config = new EnvironmentPBEConfig();// 指定加密算法config.setAlgorithm(algorithm);// 加密盐值config.setPassword(password);config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");encryptor.setConfig(config);// 加密return encryptor.encrypt(encryptedStr);}/*** 解密** @param decryptStr 解密字符串* @param password   盐值* @return*/public static String decrypt(String decryptStr, String password) {return decrypt(decryptStr, PBE_ALGORITHMS_MD5_DES, password);}/*** 解密** @param decryptStr 解密字符串* @param algorithm  指定解密算法* @param password   盐值* @return*/public static String decrypt(String decryptStr, String algorithm, String password) {StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();EnvironmentPBEConfig config = new EnvironmentPBEConfig();// 指定解密算法:解密算法要与加密算法一一对应config.setAlgorithm(algorithm);// 加密秘钥config.setPassword(password);config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");encryptor.setConfig(config);// 解密return encryptor.decrypt(decryptStr);}}

修改配置文件

如图,通过编写加/解密工具类得到对应的加密结果,然后将配置文件的原始明文密码替换成上一步对应的结果,并通过 ENC(加密结果) 包裹起来。

加密前:

加密后:

2.5.自定义加密属性前缀和后缀

如果您只想为加密属性使用不同的前缀/后缀,则可以继续使用所有默认实现,只需覆盖 application.yml (或 application.properties)中的以下属性(property):

jasypt:encryptor:property:prefix: "ENC@["suffix: "]"

2.6.防止密码泄露措施

若使用的是默认的加密规则,会让当自定义加密盐值(jasypt.encryptor.password) 泄漏,可能变得不安全。那么如何进一步防止密码泄露呢?

2.61.自定义加密器

自定义加密规则非常简单,只需要提供自定义的加密器配置类,然后通过jasypt.encryptor.bean配置指定加密配置类即可。

@Bean(name = "encryptorBean")static public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("password");config.setAlgorithm("PBEWithHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}

也将自定义加密器添加到 Spring IoC 容器中。

@Configuration
public class JasyptConfig {/*** 加解密盐值*/@Value("${jasypt.encryptor.password}")private String password;// @Bean("jasyptStringEncryptor")@Bean("encryptorBean")public StringEncryptor myStringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("password");config.setAlgorithm("PBEWithHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}
}

修改配置文件

jasypt:encryptor:# 指定加解密bean的名称,默认jasyptStringEncryptorbean: encryptorBean# 盐值password: 123456#省略其它

注意事项:Jasypt默认加解密器bean的Name为 jasyptStringEncryptor,若不想在配置文件中指定自定义加密器名称,需将自定义加密器bean的Name设置为jasyptStringEncryptor,否则将不生效。

Springcloud项目最好不要采用自定义,容易出现找不到bean的问题。

2.6.2通过环境变量指定加密盐值

方式一:直接作为程序启动时的命令行参数

java -jar test.jar --jasypt.encryptor.password=盐值

方式二:直接作为程序启动时的应用环境变量

java -Djasypt.encryptor.password=盐值 -jar test.jar

如果通过Docker部署,请在ENTRYPOINT加上对应参数,比如:

ENTRYPOINT ["java","-Djasypt.encryptor.password=test","-jar","test.jar"]

方式三:直接作为系统环境变量
1. 设置系统环境变量 :JASYPT_PWD

   在windows系统设置:

在eclipse设置,如图:

在idea中设置,需要通过VM options设置,如图:

在linux系统设置

#打开全局配置文件:      
sudo vim /etc/profile
#编辑全局配置文件:      
export JASYPT_PWD=nrmZtkF7T0kjG
#重载profile配置文件:  
source /etc/profile

2. Spring Boot的项目配置文件指定系统环境变量:

jasypt:encryptor:password: ${JASYPT_PWD:123456}

总结

本文介绍了如何在Springboot项目中使用Jasypt对配置文件中的敏感信息进行加密,包括环境配置、依赖添加、配置设置、自定义加密器和使用环境变量管理盐值,以提升项目的安全性。


http://www.mrgr.cn/news/75373.html

相关文章:

  • 机器学习: LightGBM模型(优化版)——高效且强大的树形模型
  • 【TensorRT】使用C++将yolov8 onnx转化为tensorrt格式
  • Qt 正则表达式提取文件中的 USB 设备 ID
  • 如何在 Ubuntu 22.04 上安装 ownCloud
  • vue2和vue3的区别详解
  • caozha-whois(域名Whois查询源码)
  • 表达式求值问题(中缀转后缀,对后缀求值)详解
  • Java篇方法的使用
  • 工控HMI应用场景(1):医疗终端机的界面
  • 全志科技嵌入式面试题及参考答案
  • 手动搭建 Node.js 环境
  • 【论文阅读】Prompt-to-Prompt Image Editing with Cross Attention Control
  • <项目代码>YOLOv8 瞳孔识别<目标检测>
  • Python中的“==”和“is”究竟有何不同?一篇文章让你彻底搞懂!
  • Java 网络编程:Socket 与网络通信
  • 2.6 以太网扩展技术
  • 《向量数据库指南》——Mlivus Cloud:数据安全与合规性的守护者
  • 【月之暗面kimi-注册/登录安全分析报告】
  • Visual Studio 如何在终端窗口内嵌git bash
  • 光伏智能踏勘:让踏勘告别爬屋顶,开启光伏一点通新篇章
  • 社科基金资料汇总(选题、申请、撰写全流程的资料、经典范例和历年数据)1991-2022年
  • 充气膜场馆的保温效果如何?—轻空间
  • Python io.StringIO:高效的可变字符串处理工具
  • 深度学习-卷积神经网络CNN
  • 质数的来源-2
  • 会话信息处理: HttpSession、token序列化、收集登录设备信息、基于`spring-session-data-redis`实现session共享。