SpringBoot整合jasypt實現(xiàn)重要數(shù)據(jù)加密
jasypt簡介
Jasypt(Java Simplified Encryption)是一個專注于簡化Java加密操作的開源工具。它提供了一種簡單而強大的方式來處理數(shù)據(jù)的加密和解密,使開發(fā)者能夠輕松地保護應(yīng)用程序中的敏感信息,如數(shù)據(jù)庫密碼、API密鑰等。
Jasypt的設(shè)計理念是簡化加密操作,使其對開發(fā)者更加友好。它采用密碼學(xué)強度的加密算法,支持多種加密算法,從而平衡了性能和安全性。其中,Jasypt的核心思想之一是基于密碼的加密(Password Based Encryption,PBE),通過用戶提供的密碼生成加密密鑰,然后使用該密鑰對數(shù)據(jù)進行加密和解密。此外,Jasypt還引入了鹽(Salt)的概念,通過添加隨機生成的鹽值,提高了加密的安全性,防止相同的原始數(shù)據(jù)在不同的加密過程中產(chǎn)生相同的結(jié)果,有效抵御彩虹表攻擊。
Jasypt的功能非常豐富,包括加密屬性文件、Spring Framework集成、加密Hibernate數(shù)據(jù)源配置、URL加密的Apache Wicket集成等。它還可以與Acegi Security(即Spring Security)整合,用于加密任務(wù)與應(yīng)用程序,如加密密碼、敏感信息和數(shù)據(jù)通信,以及創(chuàng)建完整檢查數(shù)據(jù)的sums等。此外,Jasypt還提供了一個開放的API,使得任何Java Cryptography Extension都可以使用它。
在Spring Boot應(yīng)用中,Jasypt Spring Boot Starter是一個方便的集成工具,可以簡化加密功能的配置。它支持多種加密算法,包括對稱加密和非對稱加密,可以根據(jù)實際需求選擇合適的加密方式。通過使用Jasypt Spring Boot Starter,可以輕松地將加密功能集成到Spring Boot應(yīng)用中,無需手動配置復(fù)雜的加密相關(guān)的代碼和配置文件。
jasypt的優(yōu)點
提供簡單的單向(摘要)和雙向加密技術(shù)。
用于任何JCE提供程序的開放API,而不僅僅是默認(rèn)的Java VM提供程序。
為您的用戶密碼提供更高的安全性。
二進制加密支持。Jasypt允許對二進制文件(字節(jié)數(shù)組)進行摘要和加密。
數(shù)值加密支持。除了文本和二進制文件,它還允許對數(shù)值進行摘要和加密(BigInteger和BigDecimal,加密Hibernate持久性時支持其他數(shù)字類型)。
完全線程安全。
支持加密/摘要池,以在多處理器/多核系統(tǒng)中實現(xiàn)高性能。
包括庫的輕量級(“精簡”)版本,以便在移動平臺等大小受限的環(huán)境中具有更好的可管理性。
SpringBoot使用jasypt
創(chuàng)建我需要的數(shù)據(jù)庫文件
-- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `s_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', `s_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', `s_birth` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', `s_sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', PRIMARY KEY (`s_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('01', '趙雷', '1990-01-01', '男'); INSERT INTO `student` VALUES ('02', '錢電', '1990-12-21', '男'); INSERT INTO `student` VALUES ('03', '孫風(fēng)', '1990-05-20', '男'); INSERT INTO `student` VALUES ('04', '李云', '1990-08-06', '男'); INSERT INTO `student` VALUES ('05', '周梅', '1991-12-01', '女'); INSERT INTO `student` VALUES ('06', '吳蘭', '1992-03-01', '女'); INSERT INTO `student` VALUES ('07', '鄭竹', '1989-07-01', '女'); INSERT INTO `student` VALUES ('08', '王菊', '1990-01-20', '女'); SET FOREIGN_KEY_CHECKS = 1;
引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.5</version> </dependency> <!-- 引入核心依賴 --> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency>
配置數(shù)據(jù)庫文件(先不進行加密)
spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false driver-class-name: com.mysql.jdbc.Driver username: root password: 2020
創(chuàng)建mapper接口
這里使用的是MybatisPlus,如果不會使用,可以看我另一篇文章SpringBoot整合MybatisPlus的基本應(yīng)用
@Mapper public interface StudentMapper extends BaseMapper<Student> { }
加下來進行進行測試。直接調(diào)用了mapper的selectList方法。
@Resource StudentMapper studentMapper; @Test void findStudent(){ List<Student> students = studentMapper.selectList(null); students.forEach(System.out::println); }
結(jié)果也沒問題。但我們這樣把數(shù)據(jù)庫密碼暴露出來難免是不安全的,別人以看你的配置文件就知道你的數(shù)據(jù)庫密碼,如果是你本地環(huán)境也就算了,但如果是你的服務(wù)器環(huán)境,一旦被別人知道了你的密碼就糟糕了,所以接下來采用加密的方式展示配置文件中的一些內(nèi)容。
配置文件加密
引入依賴
jasypt: encryptor: # 采用的加密算法 algorithm: PBEWITHHMACSHA512ANDAES_256 # 鹽粒 password: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 property: prefix: ENC( suffix: ) iv-generator-classname: org.jasypt.iv.RandomIvGenerator
把上方的依賴引入之后,我們就可以使用jasypt去進行加密了。我在這里介紹兩種方式。
1.通過測試獲取加密后的數(shù)據(jù)
@Resource StringEncryptor stringEncryptor; @Test void contextLoads() { String url = stringEncryptor.encrypt("jdbc:mysql://localhost:3306/test"); String username = stringEncryptor.encrypt("root"); String password = stringEncryptor.encrypt("2020"); System.out.println("url="+url); System.out.println("username="+username); System.out.println("password="+password); }
加密后的數(shù)據(jù)我們已經(jīng)能夠看到了,我現(xiàn)在把這些數(shù)據(jù)替換到我的application配置文件中。
spring: datasource: url: ENC(avXTcfv9THzOKeuZ0uo38uc+5+K1W/8YHL2Iarf0R308uIsr2x3rRwXWmEDUQvxIFn25IQjCpzHQaZ9+pwg0qOcBi+NaiF1AAVi8W9actPo=) driver-class-name: com.mysql.jdbc.Driver username: ENC(1u9zbtQFYbb6EiNNQrl1bfGiQ2LfuhDsQ8RPFbZSBTsetSbVmJi4jRDbTKwE8NQv) password: ENC(eG38KVuezyPxMq1kcX/eZuXZZbWKYdSY0ITlZdXCh0CXnnfH5ktdWAqiqOSmaeqB)
現(xiàn)在調(diào)用剛才測試mapper接口的方法看看結(jié)果。
還是正確的,如果你不相信,可以調(diào)用下邊的代碼來看看,你的加密數(shù)據(jù)解密后是不是你真正的數(shù)據(jù)。方法內(nèi)的參數(shù)需要你自己填寫,就是你剛才生成的那些加密的數(shù)據(jù)。我就不在這里演示了。
String url = stringEncryptor.decrypt("..."); String username = stringEncryptor.decrypt("..."); String password = stringEncryptor.decrypt("..."); System.out.println("url="+url); System.out.println("username="+username); System.out.println("password="+password);
2.通過build插件
上方給出的方法,雖然我們將數(shù)據(jù)加密了,但是作為核心的“鹽粒”我們卻暴露了出來,如果我們不想將“鹽粒”暴露呢?那么在你的pom文件中添加下邊的代碼。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-maven-plugin</artifactId> <version>3.0.3</version> <configuration> <path>file:src/main/resources/application.yml</path> </configuration> </plugin> </plugins> </build>
修改配置文件。
spring: datasource: url: DEC(jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false) driver-class-name: com.mysql.jdbc.Driver username: DEC(root) password: DEC(2020) jasypt: encryptor: algorithm: PBEWITHHMACSHA512ANDAES_256 property: prefix: ENC( suffix: ) iv-generator-classname: org.jasypt.iv.RandomIvGenerator
運行下方指令。后邊的那一串就是你要是用的密鑰,我是生成出來的。
mvn jasypt:encrypt -Djasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
之后再次點擊你的配置文件查看。原始的數(shù)據(jù)已經(jīng)被加密了,并且這個加密的“鹽粒”只有你知道。
那么接下來在調(diào)用mapper測試接口試試?這里會報紅,因為你的配置文件是加密過的,你怎么可能直接去使用一個加密過的數(shù)據(jù)呢?你必須要先解密,但是你并沒有在配置文件當(dāng)中提供這個“鹽粒”,所以你要通過其他的方式把這個“鹽粒”添加進去。
為了方便展示,我在這里創(chuàng)建一個controller,調(diào)用的是studentServiceImpl,之后在調(diào)用studentMapper。因為項目要打包,所以只能這樣展示,通過前端來展示數(shù)據(jù)。
引入web依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
在StudentController中添加方法。
@RestController @RequestMapping("/student") public class StudentController { @Resource private StudentService studentService; @RequestMapping("/find-student") public String findStudent(){ return studentService.list().toString(); } }
把項目打包。
之后在target目錄下找到我們打包好的項目,打開cmd窗口運行下方指令。(鹽粒要改成你自己的)
java -jar 你自己起的包名.jar --jasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
訪問網(wǎng)址查看,數(shù)據(jù)正確,解密成功。
到此這篇關(guān)于SpringBoot整合jasypt實現(xiàn)重要數(shù)據(jù)加密的文章就介紹到這了,更多相關(guān)SpringBoot jasypt加密數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
5分鐘快速學(xué)會spring boot整合Mybatis的方法
這篇文章主要給大家介紹了如何通過5分鐘快速學(xué)會spring boot整合Mybatis的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12java多線程之wait(),notify(),notifyAll()的詳解分析
本篇文章是對java多線程 wait(),notify(),notifyAll()進行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Spring Boot中優(yōu)雅的獲取yml文件工具類
今天小編就為大家分享一篇關(guān)于Spring Boot中優(yōu)雅的獲取yml文件工具類,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12