日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

扔掉工具类,Mybatis一个简单配置搞定数据加密解密!

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扔掉工具类,Mybatis一个简单配置搞定数据加密解密! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今日推薦

推薦 20 款 IDEA 主題!開源困境:Log4j2 維護者發聲:沒有工資,還要挨罵!!RedisJson 橫空出世,性能碾壓ES和Mongo!還在發愁寫API文檔?推薦一款阿里騰訊都在用的API管理神器!SpringBoot 參數校驗/參數驗證,常用方法都給你總結好了!

來源:juejin.cn/post/6963811586184052767

前言:介紹一個簡單的MyBatis加解密方式,日常學習工作中提及這種方法的比較少,所以拿來說說,如果已經知道這種方法的忽略本文!

一、背景

在我們數據庫中有些時候會保存一些用戶的敏感信息,比如:手機號、銀行卡等信息,如果這些信息以明文的方式保存,那么是不安全的。假如:黑客黑進了數據庫,或者離職人員導出了數據,那么就可能導致這些敏感數據的泄漏。因此我們就需要找到一種方法來解決這個問題。

二、解決方案

由于我們系統中使用了Mybatis作為數據庫持久層,因此決定使用Mybatis的TypeHandler或Plugin來解決。

TypeHandler : ?需要我們在某些列上手動指定 typeHandler 來選擇使用那個typeHandler或者根據@MappedJdbcTypes 和 @MappedTypes注解來自行推斷。

<result?column="phone"?property="phone"? typeHandler="com.huan.study.mybatis.typehandler.EncryptTypeHandler"/>

Plugin : 可以攔截系統中的 select、insert、update、delete等語句,也能獲取到sql執行前的參數和執行后的數據。

經過考慮,決定使用TypeHandler來加解密數據。

三、需求

我們有一張客戶表customer,里面有客戶手機號(phone)和客戶地址(address)等字段,其中客戶手機號(phone)是需要加密保存到數據庫中的。

1、在添加客戶信息時,自動將客戶手機號加密保存到數據中。

2、在查詢客戶信息時,自動解密客戶手機號。

四、實現思路

1、編寫一個實體類,凡是此實體類的數據都表示需要加解密的

public?class?Encrypt?{private?String?value;public?Encrypt()?{}public?Encrypt(String?value)?{this.value?=?value;}public?String?getValue()?{return?value;}public?void?setValue(String?value)?{this.value?=?value;} }

2、編寫一個加解密的TypeHandler

  • 設置參數時,加密數據。

  • 從數據庫獲取記錄時,解密數據。

package?com.huan.study.mybatis.typehandler;import?cn.hutool.crypto.SecureUtil; import?cn.hutool.crypto.symmetric.AES; import?org.apache.ibatis.type.BaseTypeHandler; import?org.apache.ibatis.type.JdbcType; import?org.apache.ibatis.type.MappedJdbcTypes; import?org.apache.ibatis.type.MappedTypes;import?java.nio.charset.StandardCharsets; import?java.sql.CallableStatement; import?java.sql.PreparedStatement; import?java.sql.ResultSet; import?java.sql.SQLException;/***?加解密TypeHandler**?@author?huan.fu?2021/5/18?-?上午9:20*/ @MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(Encrypt.class) public?class?EncryptTypeHandler?extends?BaseTypeHandler<Encrypt>?{private?static?final?byte[]?KEYS?=?"12345678abcdefgh".getBytes(StandardCharsets.UTF_8);/***?設置參數*/@Overridepublic?void?setNonNullParameter(PreparedStatement?ps,?int?i,?Encrypt?parameter,?JdbcType?jdbcType)?throws?SQLException?{if?(parameter?==?null?||?parameter.getValue()?==?null)?{ps.setString(i,?null);return;}AES?aes?=?SecureUtil.aes(KEYS);String?encrypt?=?aes.encryptHex(parameter.getValue());ps.setString(i,?encrypt);}/***?獲取值*/@Overridepublic?Encrypt?getNullableResult(ResultSet?rs,?String?columnName)?throws?SQLException?{return?decrypt(rs.getString(columnName));}/***?獲取值*/@Overridepublic?Encrypt?getNullableResult(ResultSet?rs,?int?columnIndex)?throws?SQLException?{return?decrypt(rs.getString(columnIndex));}/***?獲取值*/@Overridepublic?Encrypt?getNullableResult(CallableStatement?cs,?int?columnIndex)?throws?SQLException?{return?decrypt(cs.getString(columnIndex));}public?Encrypt?decrypt(String?value)?{if?(null?==?value)?{return?null;}return?new?Encrypt(SecureUtil.aes(KEYS).decryptStr(value));} }

注意??:

  • @MappedTypes:表示該處理器處理的java類型是什么。

  • @MappedJdbcTypes:表示處理器處理的Jdbc類型。

3、sql語句中寫法

<?xml?version="1.0"?encoding="UTF-8"?> <!DOCTYPE?mapper?PUBLIC?"-//mybatis.org//DTD?Mapper?3.0//EN"?"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper?namespace="com.huan.study.mybatis.mappers.CustomerMapper"><resultMap?id="BaseResultMapper"?type="com.huan.study.mybatis.entity.Customer"><id?column="id"?property="id"/><result?column="phone"?property="phone"/><result?column="address"?property="address"/></resultMap><insert?id="addCustomer">insert?into?customer(phone,address)?values?(#{phone},#{address})</insert><select?id="findCustomer"?resultMap="BaseResultMapper">select?*?from?customer?where?phone?=?#{phone}</select></mapper>

SQL中沒有什么特殊的寫法。

4、配置文件中指定Typehandler的包路徑

mybatis.type-handlers-package=com.huan.study.mybatis.typehandler

5、編寫后臺代碼

  • 提供一個添加方法

  • 提供一個根據手機號查詢的方法

后臺代碼比較簡單,直接查看:

https://gitee.com/huan1993/spring-cloud-parent/tree/master/mybatis/mybatis-typehandler-encrypt

貼一個mapper層的截圖。

6、測試結果

從測試結果中可知,添加數據時,需要加密的數據(phone)在數據庫中已經加密了,在查詢的時候,加密的數據已經自動解密了。

五、實現代碼

https://gitee.com/huan1993/spring-cloud-parent/tree/master/mybatis/mybatis-typehandler-encrypt

推薦文章1、一款高顏值的 SpringBoot+JPA 博客項目2、超優 Vue+Element+Spring 中后端解決方案3、推薦幾個支付項目!4、推薦一個 Java 企業信息化系統5、一款基于 Spring Boot 的現代化社區(論壇/問答/社交網絡/博客)

總結

以上是生活随笔為你收集整理的扔掉工具类,Mybatis一个简单配置搞定数据加密解密!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。