Mybatis使用typeHandler加密的實(shí)現(xiàn)
1引入依賴
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-crypto</artifactId> <version>5.7.16</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core</artifactId> <version>5.7.16</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.59</version> </dependency>
2.配置mybatis
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="logPrefix" value="show_sql."/> <!-- <setting name="logImpl" value="STDOUT_LOGGING" />--> <setting name="callSettersOnNulls" value="true" /> <setting name="cacheEnabled" value="true" /> <setting name="lazyLoadingEnabled" value="true" /> <setting name="aggressiveLazyLoading" value="true" /> <setting name="multipleResultSetsEnabled" value="true" /> <setting name="useColumnLabel" value="true" /> <setting name="useGeneratedKeys" value="false" /> <setting name="autoMappingBehavior" value="PARTIAL" /> <setting name="defaultExecutorType" value="SIMPLE" /> <setting name="mapUnderscoreToCamelCase" value="true" /> <setting name="localCacheScope" value="SESSION" /> <setting name="jdbcTypeForNull" value="NULL" /> <setting name="logImpl" value="LOG4J2"/> <!-- 打印sql--> </settings> <typeHandlers> <package name="test.handler"/> </typeHandlers> <mappers> <package name="test.mapper"/> </mappers> </configuration>
3.yml配置
mybatis: config-location: classpath:mybatis-config.xml
4.加密工具類
package test.utils; import cn.hutool.core.util.RandomUtil; import cn.hutool.crypto.Mode; import cn.hutool.crypto.Padding; import cn.hutool.crypto.symmetric.SM4; import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Arrays; public class SM4Util { private static final Charset ENCODING = StandardCharsets.UTF_8; public SM4Util() { } public static String generateKey() { return ByteUtils.toHexString(RandomUtil.randomString(RandomUtil.BASE_CHAR_NUMBER, 16).getBytes()); } /** * @Description:加密 */ public static String encryptEcb(String hexKey, String paramStr, Charset charset) throws Exception { String cipherText = ""; if (null != paramStr && !"".equals(paramStr)) { SM4 sm4 = new SM4(Mode.ECB.name(), Padding.PKCS5Padding.name(), ByteUtils.fromHexString(hexKey)); cipherText = sm4.encryptHex(paramStr, charset); } return cipherText; } public static String encryptEcb(String key, String data) throws Exception { return encryptEcb(key, data, ENCODING); } /** * sm4解密 * * @param hexKey * @param cipherText * @param charset * @return * @throws Exception */ public static String decryptEcb(String hexKey, String cipherText, Charset charset) throws Exception { SM4 sm4 = new SM4(Mode.ECB.name(), Padding.PKCS5Padding.name(), ByteUtils.fromHexString(hexKey)); return sm4.decryptStr(cipherText); } /** * sm4解密 * * @param key 密鑰 * @param data 加密的數(shù)據(jù) * @return 解密后的數(shù)據(jù) * @throws Exception 異常 */ public static String decryptEcb(String key, String data) throws Exception { return decryptEcb(key, data, ENCODING); } /** * @Description:密碼校驗(yàn) */ public static boolean verifyEcb(String hexKey, String cipherText, String paramStr) throws Exception { boolean flag = false; byte[] keyData = ByteUtils.fromHexString(hexKey); byte[] cipherData = ByteUtils.fromHexString(cipherText); SM4 sm4 = new SM4(Mode.ECB.name(), Padding.PKCS5Padding.name(), keyData); byte[] decryptData = sm4.decrypt(cipherData); byte[] srcData = paramStr.getBytes(ENCODING); flag = Arrays.equals(decryptData, srcData); return flag; } }
5.typeHandler繼承類
package test.handler; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import test.utils.SM4Util; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @Description typeHandler加解密處理器 將String類型的字段加密或解密 */ public class SM4CryptoTypeHandler extends BaseTypeHandler<String> { //sm4加密key上線后請勿更改 private final static String PKEY = "912058752095k2948123c394ht868r0j"; private static final Logger log = LoggerFactory.getLogger(SM4CryptoTypeHandler.class); /* * 加工入?yún)? */ @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { if (parameter != null) { //加密 String encryptHex = null; try { encryptHex = SM4Util.encryptEcb(PKEY,parameter); } catch (Exception e) { log.error("數(shù)據(jù)庫字段加密錯誤",e); } log.debug("{} ---加密為---> {}", parameter, encryptHex); ps.setString(i, encryptHex); } } /* * 根據(jù)列名獲取返回結(jié)果,可在此方法中加工返回值 */ @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { String originRes = rs.getString(columnName); if (originRes != null) { String res = originRes; try { res = SM4Util.decryptEcb(PKEY,originRes); } catch (Exception e) { //e.printStackTrace(); log.error("數(shù)據(jù)庫"+columnName+"列字段解密錯誤",e); } log.debug("{} ---解密為---> {}", originRes, res); return res; } log.debug("結(jié)果為空,無需解密"); return null; } /* * 根據(jù)列下標(biāo)獲取返回結(jié)果,可在此方法中加工返回值 */ @Override public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String originRes = rs.getString(columnIndex); if (originRes != null) { String res = originRes; try { res = SM4Util.decryptEcb(PKEY,originRes); } catch (Exception e) { //e.printStackTrace(); log.error("數(shù)據(jù)庫第"+columnIndex+"列字段解密錯誤",e); } log.debug("第[{}]列:{} ---解密為---> {}",columnIndex, originRes, res); return res; } log.info("結(jié)果為空,無需解密"); return null; } /* * 根據(jù)列下標(biāo)獲取返回結(jié)果(存儲過程),可在此方法中加工返回值 */ @Override public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String originRes = cs.getString(columnIndex); if (originRes != null) { String res = originRes; try { res = SM4Util.decryptEcb(PKEY,originRes); } catch (Exception e) { //e.printStackTrace(); log.error("數(shù)據(jù)庫第"+columnIndex+"列字段解密錯誤",e); } log.debug("第[{}]列:{} ---解密為---> {}",columnIndex, originRes, res); } log.debug("結(jié)果為空,無需解密"); return null; } }
6.mapper層xml和interface
package test.mapper; import org.apache.ibatis.annotations.Param; import test.entry.Test; public interface TestMapper { int insert(Test record); }
<?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="test.mapper.TestMapper"> <resultMap id="BaseResultMap" type="test.entry.Test"> <result column="test" jdbcType="VARCHAR" property="test" typeHandler="test.handler.SM4CryptoTypeHandler"/> </resultMap> <insert id="insert" parameterType="test.entry.Test"> insert into t_test (test) values (#{test,jdbcType=VARCHAR,typeHandler=test.handler.SM4CryptoTypeHandler}) </insert> </mapper>
到此這篇關(guān)于Mybatis使用typeHandler加密的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Mybatis typeHandler加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis?typeHandler接口的定義和使用
- MyBatis中的自定義TypeHandler詳解
- Mybatis中自定義TypeHandler處理枚舉的示例代碼
- Mybatis的TypeHandler實(shí)現(xiàn)數(shù)據(jù)加解密詳解
- Mybatis中TypeHandler使用小結(jié)
- SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)
- MyBatis-Plus?中?typeHandler?的使用實(shí)例詳解
- MyBatis中TypeHandler的使用教程詳解
- MyBatis類型處理器TypeHandler的作用及說明
- MyBatis自定義TypeHandler實(shí)現(xiàn)字段加密解密
相關(guān)文章
Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示
這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Java?MyBatis傳出參數(shù)resultType和resultMap解讀
這篇文章主要介紹了Java?MyBatis傳出參數(shù)resultType和resultMap解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12java基于雙向環(huán)形鏈表解決丟手帕問題的方法示例
這篇文章主要介紹了java基于雙向環(huán)形鏈表解決丟手帕問題的方法,簡單描述了丟手帕問題,并結(jié)合實(shí)例形式給出了Java基于雙向環(huán)形鏈表解決丟手帕問題的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-11-11使用Sharding-JDBC對數(shù)據(jù)進(jìn)行分片處理詳解
這篇文章主要介紹了使用Sharding-JDBC對數(shù)據(jù)進(jìn)行分片處理詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10JAVA 字符串加密、密碼加密實(shí)現(xiàn)方法
這篇文章主要介紹了JAVA 字符串加密、密碼加密實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2016-10-10SpringBoot 指標(biāo)監(jiān)控actuator的專題
未來每一個微服務(wù)在云上部署以后,我們都需要對其進(jìn)行監(jiān)控、追蹤、審計、控制等。SpringBoot就抽取了Actuator場景,使得我們每個微服務(wù)快速引用即可獲得生產(chǎn)級別的應(yīng)用監(jiān)控、審計等功能,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下2021-11-11解讀RabbitMQ和kafka的相同點(diǎn)和不同點(diǎn)是什么
RabbitMQ和Kafka都是消息中間件,支持分布式系統(tǒng)、高可用性和可靠性,RabbitMQ使用隊(duì)列模型,適合復(fù)雜路由場景;Kafka使用主題-分區(qū)模型,適合大規(guī)模數(shù)據(jù)流處理,RabbitMQ在低延遲方面表現(xiàn)更好,Kafka在高吞吐量方面表現(xiàn)更好2024-12-12Java使用正則表達(dá)式驗(yàn)證手機(jī)號和電話號碼的方法
今天小編就為大家分享一篇關(guān)于Java使用正則表達(dá)式驗(yàn)證手機(jī)號和電話號碼的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12