Spring Boot整合Jasypt 庫實現配置文件和數據庫字段敏感數據的加解密

在這里插入圖片描述

😄 19年之后由于某些原因斷更了三年,23年重新揚帆起航,推出更多優質博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有堅忍不拔之志
🎐 個人CSND主頁——Micro麥可樂的博客
🐥《Docker實操教程》專欄以最新的Centos版本為基礎進行Docker實操教程,入門到實戰
🌺《RabbitMQ》本專欄主要介紹使用JAVA開發RabbitMQ的系列教程,從基礎知識到項目實戰
🌸《設計模式》專欄以實際的生活場景為案例進行講解,讓大家對設計模式有一個更清晰的理解
💕《Jenkins實戰》專欄主要介紹Jenkins+Docker+Git+Maven的實戰教程,讓你快速掌握項目CI/CD,是2024年最新的實戰教程
如果文章能夠給大家帶來一定的幫助!歡迎關注、評論互動~

Spring Boot整合Jasypt 庫實現配置文件和數據庫字段敏感數據的加解密

  • 1、前言
  • 2、什么是Jasypt
  • 3、什么是Jasypt-Spring-Boot
  • 4、接入初體驗
    • 4.1 yml配置方式
    • 4.2 自定義配置類方式
    • 4.3 開始測試
    • 4.4 修改mysql參數加密
  • 5、使用JVM啟動參數設置密鑰
  • 6、加密和解密數據庫字段
  • 7、結語

1、前言

在我們日常開發中,很多時候為了保證數據的安全,在處理敏感數據前后端數據傳輸數據庫敏感數據入庫等,數據的加密和解密是不可忽視的重要環節,特別是一些政企項目這點就尤為重要,避免每一次安全審計后反復的調整,所以在系統設計之初我們就應當把數據安全的問題考慮進去!

今天博主就給大家詳細介紹Jasypt-Spring-Boot的功能,并展示如何在Spring Boot項目中實現各種加解密操作

2、什么是Jasypt

Jasypt(Java Simplified Encryption)是一個用于加密和解密數據的Java庫。它提供了簡單易用的API,可以輕松地將加密功能集成到Java應用程序中。Jasypt支持多種加密算法,并且可以保護各種類型的數據,包括文本、配置文件和數據庫字段等。

3、什么是Jasypt-Spring-Boot

Jasypt-Spring-Boot是一個用于在Spring Boot應用程序中集成Jasypt的Starter。通過使用Jasypt-Spring-Boot,我們可以輕松地在Spring Boot項目中配置和使用Jasypt的加解密功能。
目前該庫已經有2.8K的Star,且目前最新版本是 3.0.5
在這里插入圖片描述

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

4、接入初體驗

在開始接入前首先構建我們的 Spring Boot 項目, 引入相關依賴

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>

4.1 yml配置方式

修改 Spring Boot 配置文件,增加密鑰

jasypt:encryptor:password: 123456

Spring Boot 啟動類上 或配置類Configuration類上追加 @EnableEncryptableProperties注解

具體參數說明可以查看以下表格

配置項必填默認值說明
jasypt.encryptor.password設置密鑰
jasypt.encryptor.algorithmPBEWITHHMACSHA512ANDAES_256設置算法
jasypt.encryptor.key-obtention-iterations1000設置密鑰生成的迭代次數
jasypt.encryptor.pool-size1設置加密池的大小
jasypt.encryptor.provider-nameSunJCE設置加密提供者名稱
jasypt.encryptor.provider-class-namenull設置加密提供類名
jasypt.encryptor.salt-generator-classnameorg.jasypt.salt.RandomSaltGenerator設置鹽值生成器的類名
jasypt.encryptor.iv-generator-classnameorg.jasypt.iv.RandomIvGenerator設置初始化向量生成器的類名
jasypt.encryptor.string-output-typebase64設置輸出字符串的編碼方式
jasypt.encryptor.proxy-property-sourcesfalse
jasypt.encryptor.skip-property-sourcesempty list

最后一個屬性jasypt.encryptor.proxy-property-sources用于指示jasyp-spring-boot如何攔截屬性值以進行解密

  • 默認值false使用PropertySourceEnumerablePropertySourceMapPropertySource的自定義包裝器實現。
  • 當為該屬性指定true時,攔截機制將在每個特定的PropertySource實現上使用CGLib代理。這在某些必須保留原始PropertySource類型的場景中可能很有用

4.2 自定義配置類方式

創建一個自定義配置類:Bean名稱為: jasyptStringEncryptor

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableEncryptableProperties
public class StringEncryptorConfig {@Bean("jasyptStringEncryptor")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.RandomIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}
}

溫馨提示

  • 在自定義StringEncryptor的時候,會覆蓋默認的加密器,且Bean名稱固定為 jasyptStringEncryptor
  • 如果你需要自定義Bean名稱,則需要在springboot配置文件追加
    jasypt.encryptor.bean = your encryptorBean Name

如下面自定義自定義Bean名稱

    @Bean("encryptorBean")public StringEncryptor stringEncryptor() {//參考上面的配置參數...}

4.3 開始測試

我們現在來編寫一個測試類,來體驗加解密的效果

	@Resource(name = "jasyptStringEncryptor")private StringEncryptor stringEncryptor;@Testpublic void testJasypt() {String mysqlRoot = stringEncryptor.encrypt("root");String mysqlPassword = stringEncryptor.encrypt("123456");System.out.println("mysqlroot加密后:"+mysqlRoot);System.out.println("mysqlPassword加密后:"+mysqlPassword);System.out.println("===================");System.out.println("mysqlRoot解密后:"+ stringEncryptor.decrypt(mysqlRoot));System.out.println("mysqlPassword解密后:"+ stringEncryptor.decrypt(mysqlPassword));}

測試輸出如下:
在這里插入圖片描述

4.4 修改mysql參數加密

我們已經獲得了mysql加密后的賬號以及密碼,現在我們來給mysql配置的明文賬戶密碼改一下

加密格式:默認的前后綴是 ENC() 括號里是密文

# 數據源配置
spring:#數據源配置datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:url: jdbc:mysql://localhost:3306/docker_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8# 未加密前#username: root#password: 123456# 加密后username: ENC(TBTl1fiJ7tilJ91sEdym6G8vEQG7Wn3QhIBU77mrfzCtqkHPMEMAihvpjokqUgMP)password: ENC(9galEBTwYzgGG6ER3oY+k45463tkvYSnt+epH8SE/hldbi13hg3+XL7CPKpgJAQp)

啟動SpringBoot項目。觀察控制臺輸出,數據庫是否完成連接初始化,且項目啟動成功!

在這里插入圖片描述

特別說明
小伙伴發現了在mysql的配置中,我們使用 ENC() 來包裹我們的密文,這個前后綴是可以修改的,如MICRO()

修改配置文件方式

jasypt:encryptor:property:prefix: "MICRO["suffix: "]"

編碼方式

我們可以通過創建一個名為 encryptablePropertyDetector 類型為 EncryptablePropertyDetector 的Bean來覆蓋默認實現,如果你需要修改默認名稱,需要覆蓋屬性 jasypt.encryptor.property.detector-bean 并指定您希望給予bean的名稱

private static class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {@Overridepublic boolean isEncrypted(String value) {if (value != null) {return value.startsWith("MICRO");}return false;}@Overridepublic String unwrapEncryptedValue(String value) {return value.substring("MICRO".length());}
}
@Bean(name = "encryptablePropertyDetector")public EncryptablePropertyDetector encryptablePropertyDetector() {return new MyEncryptablePropertyDetector();}

5、使用JVM啟動參數設置密鑰

在我們 YML 配置方式中, jasypt.encryptor.password=123456 是明文的,有小伙伴會問,哎呀這不也是暴露了加密密鑰么? 要解決這個問題,我們可以使用JVM啟動參數設置

在IDEA項目里 ,點擊 Edit Configurations ,添加 VM 啟動參數 -Djasypt.encryptor.password=123456
在這里插入圖片描述
在這里插入圖片描述
在生產環境部署jar包的時候,可以使用如下命令啟動:

java -jar your-project.jar --jasypt.encryptor.password=password

6、加密和解密數據庫字段

在我們公司某些項目中,用戶的敏感信息是不允許明文存儲數據庫的,比如手機號、身份證等,接下來我們來演示如何在實體類中使用Jasypt進行數據庫字段實現加解密

注意引入JPA支持 spring-boot-starter-data-jpa

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import org.jasypt.util.text.AES256TextEncryptor;@Component
@Converter
public class EncryptedStringConverter implements AttributeConverter<String, String> {@Resource(name = "jasyptStringEncryptor")private StringEncryptor stringEncryptor;@Overridepublic String convertToDatabaseColumn(String attribute) {return stringEncryptor.encrypt(attribute);}@Overridepublic String convertToEntityAttribute(String dbData) {return stringEncryptor.decrypt(dbData);}
}

然后在實體類中使用這個轉換器

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Convert(converter = EncryptedStringConverter.class)@Column(name = "password")private String password;// Getters and Setters
}

7、結語

Jasypt-Spring-Boot是一個強大且易于使用的工具,可以在Spring Boot應用程序中實現加密和解密操作。通過本文的介紹,我們了解了如何在Spring Boot項目中配置和使用Jasypt,并展示了各種加解密操作的實現方法。

下一篇我們將針對Jasypt整合升級一下,使用自定義注解和AOP實現敏感數據加解密,點點關注更新不迷路哦~


在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/22791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/22791.shtml
英文地址,請注明出處:http://en.pswp.cn/web/22791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄第二十九天打卡| 491.遞增子序列,46.全排列,47.全排列 II

491.遞增子序列 本題和大家剛做過的 90.子集II 非常像&#xff0c;但又很不一樣&#xff0c;很容易掉坑里。 代碼隨想錄 視頻講解&#xff1a;回溯算法精講&#xff0c;樹層去重與樹枝去重 | LeetCode&#xff1a;491.遞增子序列_嗶哩嗶哩_bilibili class Solution { public:…

好用軟件推薦

軟件功能相關介紹地址FastStone截圖&#xff08;長截圖、定時截圖等&#xff09;CSDNhttps://www.faststone.org/FSCaptureDownload.htmQuicker快捷訪問https://getquicker.net/https://getquicker.net/

大數據學習問題記錄

問題記錄 node1突然無法連接finalshell node1突然無法連接finalshell 今天我打開虛擬機和finalshell的時候&#xff0c;發現我的node1連接不上finalshell,但是node2、node3依舊可以鏈接&#xff0c;我在網上找了很多方法&#xff0c;但是是關于全部虛擬機連接不上finalshell&a…

統一返回響應

前言 我們為什么要設置統一返回響應 提高代碼的可維護性&#xff1a;通過統一返回請求的格式&#xff0c;可以使代碼更加清晰和易于維護&#xff0c;減少重復的代碼&#xff0c;提高代碼質量。 便于調試和測試&#xff1a;統一的返回格式使得在調試和測試時更為簡單&#xff…

大模型時代,是 Infra 的春天還是冬天?

Highlights 大模型時代元年感悟 Scaling Laws 是大模型時代的摩爾定律,是最值得研究的方向 LLM 發展的三個階段: 算法瓶頸 -> 數據瓶頸 -> Infra 瓶頸 為什么 GPT 一枝獨秀, BERT、T5 日落西山? 大模型時代,是大部分 Infra 人的冬天,少部分 Infra 人的春天(算法研…

算法金 | 一文讀懂K均值(K-Means)聚類算法

?大俠幸會&#xff0c;在下全網同名[算法金] 0 基礎轉 AI 上岸&#xff0c;多個算法賽 Top [日更萬日&#xff0c;讓更多人享受智能樂趣] 1. 引言 數據分析中聚類算法的作用 在數據分析中&#xff0c;聚類算法用于發現數據集中的固有分組&#xff0c;通過將相似對象聚集在一…

Qt——前言

一、Qt介紹 ? **Qt技術特指用來桌面應用開發&#xff1b;**客戶端開發的重要任務就是編寫和用戶交互的界面&#xff1b;而與用戶交互的界面有兩種典型風格&#xff0c;1.命令行界面/終端界面&#xff0c;TUI&#xff1b;2.圖形化界面&#xff0c;GUI&#xff1b; ? Qt就是用…

統一響應,自定義校驗器,自定義異常,統一異常處理器

文章目錄 1.基本準備&#xff08;構建一個SpringBoot模塊&#xff09;1.在A_universal_solution模塊下創建新的子模塊unified-processing2.pom.xml引入基本依賴3.編寫springboot啟動類4.啟動測試 2.統一響應處理1.首先定義一個響應枚舉類 RespBeanEnum.java 每個枚舉對象都有co…

信息學奧賽初賽天天練-20-完善程序-vector數組參數引用傳遞、二分中值與二分邊界應用的深度解析

PDF文檔公眾號回復關鍵字:20240605 1 2023 CSP-J 完善程序1 完善程序&#xff08;單選題&#xff0c;每小題 3 分&#xff0c;共計 30 分&#xff09; 原有長度為 n1,公差為1等升數列&#xff0c;將數列輸到程序的數組時移除了一個元素&#xff0c;導致長度為 n 的開序數組…

云原生架構案例分析_5.某體育用品公司云原生架構的業務中臺構建

1.背景和挑戰 某體育用品公司作為中國領先的體育用品企業之一&#xff0c;在2016年&#xff0c;某體育用品公司啟動集團第三次戰略升級&#xff0c;打造以消費者體驗為核心的“3”&#xff08;“互聯網”、“體育”和“產品”&#xff09;的戰略目標&#xff0c;積極擁抱云計算…

NeuralForecast TokenEmbedding 一維卷積 (Conv1d) 與矩陣乘法

NeuralForecast TokenEmbedding 一維卷積 (Conv1d) 與矩陣乘法 flyfish TokenEmbedding中使用了一維卷積 (Conv1d) TokenEmbedding 源碼分析 在源碼的基礎上增加調用示例 下面會分析這段代碼 import torch import torch.nn as nn class TokenEmbedding(nn.Module):def __i…

C++模板類與Java泛型類的實戰應用及對比分析

C模板類和Java泛型類都是用于實現代碼重用和類型安全性的重要工具&#xff0c;但它們在實現方式和應用上有一些明顯的區別。下面&#xff0c;我將先分別介紹它們的實戰應用&#xff0c;然后進行對比分析。 C模板類的實戰應用 C模板類允許你定義一種通用的類&#xff0c;其中類…

SEO 與 PPC 之間的區別

按點擊付費 &#xff08;PPC&#xff09;&#xff1a; PPC 是一種網絡營銷技術&#xff0c;廣告商在每次點擊廣告時向網站支付一定金額&#xff0c;廣告商只為符合條件的點擊付費。Google 廣告、Bing 和 Yahoo 廣告基于按點擊付費的概念。PPC是用于在搜索引擎首頁上列出的最快方…

【前端】響應式布局筆記——rem

三、rem 指相對于根元素的字體大小的單位。 根字體大小通常設置為10px,方便換算。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

鴻蒙開發接口安全:【@system.cipher (加密算法)】

加密算法 說明&#xff1a; 本模塊首批接口從API version 3開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 導入模塊 import cipher from system.ciphercipher.rsa rsa(Object): void RSA 算法加解密。 系統能力&#xff1a; SystemCapabil…

Pointnet++改進卷積系列:全網首發SMPConv連續卷積 |即插即用,提升特征提取模塊性能

簡介:1.該教程提供大量的首發改進的方式,降低上手難度,多種結構改進,助力尋找創新點!2.本篇文章對Pointnet++特征提取模塊進行改進,加入SMPConv,提升性能。3.專欄持續更新,緊隨最新的研究內容。 目錄 1.理論介紹 2.修改步驟 2.1 步驟一 2.2 步驟二 2.3 步驟

K8S==ingress配置自簽名證書

安裝openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 生成證書 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example.local.key -out example.local.crt -subj "/CNexample.local/Oexample.local"創建K8S secr…

【簡單講解TalkingData的數據統計】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

Vue3中的常見組件通信之mitt

Vue3中的常見組件通信之mitt 概述 ? 在vue3中常見的組件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的組件關系用不同的傳遞方式。常見的撘配形式如下表所示。 組件關系傳遞方式父傳子1. props2. v-model3. $refs…

用例篇03

正交表 因素&#xff1a;存在的條件 水平&#xff1a;因素的取值 最簡單的正交表&#xff1a;L4(2) 應用 allpairs 來實現正交表。 步驟&#xff1a; 1.根據需求找出因素和水平 2.將因素和水平寫入到excel表格中&#xff08;表格不需要保存&#xff09;&#xff08;推薦用…