Mybatis給數(shù)據(jù)庫敏感字段加解密詳解
前言
為了保護(hù)數(shù)據(jù)庫敏感字段數(shù)據(jù)安全,有時(shí)候我們需要將敏感數(shù)據(jù)加密入庫,查詢時(shí)再解密成明文。
我們可以利用Mybatis自定義TypeHandler來處理,下面我們來具體實(shí)現(xiàn)一下。
定義KeyCenterUtils加解密工具類
import org.springframework.stereotype.Service;
import java.util.Base64;
@Service
public class KeyCenterUtils {
public String encrypt(String src) {
try {
String result = Base64.getEncoder().encodeToString(src.getBytes("UTF-8"));
return result;
} catch (Exception e) {
throw new RuntimeException("encrypt fail!", e);
}
}
public String decrypt(String src) {
try {
byte[] asBytes = Base64.getDecoder().decode(src);
String result = new String(asBytes, "UTF-8");
return result;
} catch (Exception e) {
throw new RuntimeException("decrypt fail!", e);
}
}
}自定義Handler類實(shí)現(xiàn)數(shù)據(jù)庫字段加解密
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mk.util.KeyCenterUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CustomTypeHandler<T> extends BaseTypeHandler<T> {
@Autowired
private KeyCenterUtils keyCenterUtils;
public CustomTypeHandler() {
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, this.keyCenterUtils.encrypt((String)parameter));
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
String columnValue = rs.getString(columnName);
//有一些可能是空字符
return StringUtils.isBlank(columnValue) ? (T)columnValue : (T)this.keyCenterUtils.decrypt(columnValue);
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String columnValue = rs.getString(columnIndex);
return StringUtils.isBlank(columnValue) ? (T)columnValue : (T)this.keyCenterUtils.decrypt(columnValue);
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String columnValue = cs.getString(columnIndex);
return StringUtils.isBlank(columnValue) ? (T)columnValue : (T)this.keyCenterUtils.decrypt(columnValue);
}
}因?yàn)槲矣玫氖荕ybatis-Plus,所以可以使用Mybatis-Plus的@TableField的注解通過typeHandler屬性指定上面自定義的Handler即可。
實(shí)體類添加注解
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "lemon_user", autoResultMap = true)
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
@TableField(typeHandler = CustomTypeHandler.class)
private String password;
private String salt;
}注意:上面的@TableName注解設(shè)置了autoResultMap = true的屬性值,這樣通過Mybatis-Plus的BaseMapper查詢出來的數(shù)據(jù)才會(huì)將加密字段進(jìn)行解密,默認(rèn)不生效。
如果不是Mybatis-Plus的 BaseMapper內(nèi)部的方法,則需要我們?cè)诓樵儠r(shí)在resultMap的屬性中指定我們自定義的typeHandler,如下:
<resultMap id="baseResultMap" type="com.mk.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password" typeHandler="com.mk.handler.CustomTypeHandler"/>
</resultMap>
<select id="getUserByName" resultMap="baseResultMap">
select * from lemon_user where username = #{username}
</select>到此這篇關(guān)于Mybatis給數(shù)據(jù)庫敏感字段加解密詳解的文章就介紹到這了,更多相關(guān)Mybatis敏感字段加解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java連接數(shù)據(jù)庫JDBC技術(shù)之prepareStatement的詳細(xì)介紹
這篇文章主要介紹了Java連接數(shù)據(jù)庫JDBC技術(shù)之prepareStatement的詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
淺析如何在SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏
脫敏是指在不改變?cè)瓟?shù)據(jù)結(jié)構(gòu)的前提下,通過某種方式處理數(shù)據(jù),使數(shù)據(jù)不能直接暴露用戶的真實(shí)信息,下面我們就來看看SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏的具體方法吧2024-03-03
帶你重新認(rèn)識(shí)MyBatis的foreach
這篇文章主要介紹了重新認(rèn)識(shí)MyBatis的foreach,本文提出了一種簡(jiǎn)化<foreach>寫法的設(shè)想,更重要的是通過解決空集時(shí)生成的SQL語法問題,更深刻地理解MyBatis的foreach的生成機(jī)制,需要的朋友可以參考下2022-11-11
Java通過反射機(jī)制動(dòng)態(tài)設(shè)置對(duì)象屬性值的方法
下面小編就為大家?guī)硪黄狫ava通過反射機(jī)制動(dòng)態(tài)設(shè)置對(duì)象屬性值的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07

