使用Mybatis的TypeHandler加解密數(shù)據(jù)

一、背景

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

二择葡、解決方案

由于我們系統(tǒng)中使用了Mybatis作為數(shù)據(jù)庫持久層,因此決定使用MybatisTypeHandlerPlugin來解決剃氧。

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

    • <result column="phone" property="phone" typeHandler="com.huan.study.mybatis.typehandler.EncryptTypeHandler"/>
      
  • Plugin : 可以攔截系統(tǒng)中的 select、insert朋鞍、update已添、delete等語句,也能獲取到sql執(zhí)行前的參數(shù)和執(zhí)行后的數(shù)據(jù)滥酥。

經(jīng)過考慮更舞,決定使用TypeHandler來加解密數(shù)據(jù)。

三坎吻、需求

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

1刊头、在添加客戶信息時,自動將客戶手機號加密保存到數(shù)據(jù)中诸尽。

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

四穿肄、實現(xiàn)思路

1年局、編寫一個實體類,凡是此實體類的數(shù)據(jù)都表示需要加解密的

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

  • 設置參數(shù)時某宪,加密數(shù)據(jù)。
  • 從數(shù)據(jù)庫獲取記錄時锐朴,解密數(shù)據(jù)兴喂。
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);

    /**
     * 設置參數(shù)
     */
    @Override
    public 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);
    }

    /**
     * 獲取值
     */
    @Override
    public Encrypt getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return decrypt(rs.getString(columnName));
    }

    /**
     * 獲取值
     */
    @Override
    public Encrypt getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return decrypt(rs.getString(columnIndex));
    }

    /**
     * 獲取值
     */
    @Override
    public 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));
    }
}

注意??:

  1. @MappedTypes:表示該處理器處理的java類型是什么。
  2. @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壶谒、編寫后臺代碼

  1. 提供一個添加方法
  2. 提供一個根據(jù)手機號查詢的方法

后臺代碼比較簡單,直接查看 https://gitee.com/huan1993/spring-cloud-parent/tree/master/mybatis/mybatis-typehandler-encrypt

貼一個mapper層的截圖膳沽。

mapper層的寫法

6汗菜、測試結果

數(shù)據(jù)庫字段加解密結果

從測試結果中可知,添加數(shù)據(jù)時挑社,需要加密的數(shù)據(jù)(phone)在數(shù)據(jù)庫中已經(jīng)加密了陨界,在查詢的時候,加密的數(shù)據(jù)已經(jīng)自動解密了痛阻。

五菌瘪、實現(xiàn)代碼

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

六、參考文檔

1阱当、https://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers

2俏扩、https://github.com/mybatis/spring-boot-starter

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市弊添,隨后出現(xiàn)的幾起案子录淡,更是在濱河造成了極大的恐慌,老刑警劉巖油坝,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫉戚,死亡現(xiàn)場離奇詭異,居然都是意外死亡免钻,警方通過查閱死者的電腦和手機彼水,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來极舔,“玉大人凤覆,你說我怎么就攤上這事〔鹞海” “怎么了盯桦?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵慈俯,是天一觀的道長。 經(jīng)常有香客問我拥峦,道長贴膘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任略号,我火速辦了婚禮刑峡,結果婚禮上,老公的妹妹穿的比我還像新娘玄柠。我一直安慰自己突梦,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布羽利。 她就那樣靜靜地躺著宫患,像睡著了一般。 火紅的嫁衣襯著肌膚如雪这弧。 梳的紋絲不亂的頭發(fā)上娃闲,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音匾浪,去河邊找鬼皇帮。 笑死,一個胖子當著我的面吹牛户矢,可吹牛的內(nèi)容都是我干的玲献。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼梯浪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓢娜?” 一聲冷哼從身側響起挂洛,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眠砾,沒想到半個月后虏劲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡褒颈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年柒巫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷丸。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡堡掏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刨疼,到底是詐尸還是另有隱情泉唁,我是刑警寧澤鹅龄,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站亭畜,受9級特大地震影響扮休,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拴鸵,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一玷坠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劲藐,春花似錦侨糟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厉膀,卻和暖如春溶耘,著一層夾襖步出監(jiān)牢的瞬間沦童,已是汗流浹背泉粉。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工胆数, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冷尉,地道東北人倒源。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓评也,卻偏偏與公主長得像遵湖,于是被迫代替她去往敵國和親塑娇。 傳聞我的和親對象是個殘疾皇子仗哨,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容