SpringBoot接口返回数据脱敏(Mybatis、Jackson)

文章介绍了如何使用Mybatis的TypeHandler实现数据库数据的加密解密,以及通过自定义Jackson注解实现序列化过程中的敏感信息脱敏。两种方法提供了在存储和传输敏感数据时的安全保护措施。

一、前言

有时候,我们接口返回的数据需要做一些处理,有一些敏感数据,我们不能全部返回给用户,需要用*号隐藏掉一部分关键数据,使得该敏感数据变得不完全,其他人无法知道脱敏前的数据是什么样的。同时,存储在底层数据库的数据,一些关键信息如用户密码、身份证、手机号等敏感信息,也不能够通过明文的方式存放在数据库中。

数据脱敏有以下几种做法:

1、通过Mybatis处理

2、通过自定义Jackson注解,实现在属性序列化过程中处理数据

3、其他方式

二、Mybatis数据脱敏

在数据库中,根据业务需求存放了不少的有关用户的敏感信息,比如身份证、手机、住址、密码等信息,如果这些数据都是以明文的形式存放的,那么,当数据库被破解后,用户这些重要的信息都会被泄露。

数据加密解密很简单,如果自己手动在插入数据前对数据加密,读取到数据后进行手动解密,那么将会很麻烦。

因此,对于数据库数据的加密解密将采用Mybatis的TypeHandler处理,在我们为数据库提供数据后,会根据我们的需求,对部分数据进行加密。在读取后数据最终到我们手上前,会对读取到数据进行解密。请给位跟随以下的做法,实现Mybatis数据脱敏把。

1、自定义一个TypeHandler类型的处理器,用于处理数据的加密和解密

TypeHandler用于处理数据在数据库类型和java类型之间的转换,默认情况下,我们常用的String、Long、Date等java类型都有对应的TypeHandler进行处理,我们自定义TypeHanler的情况在于目前没有对应的数据转换处理器。

以下为自定义的字符串加密解密处理器:

import cn.hutool.crypto.symmetric.AES;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Objects;

/**
 * mybatis String类型敏感字段处理类
 * 可以通过实现TypeHandler,但是BaseTypeHandler已经实现了,我们可以继承它
 */
public class SensitiveColumnHandler extends BaseTypeHandler<String> {

    private static final String key = "wjfgncvkdkd25fc2";

    /**
     * 设置参数值,在此处对字段值进行加密处理
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        // 如果字段或字段值为空,不进行处理
        if(StringUtils.isEmpty(parameter)){
            ps.setString(i, parameter);
            return;
        }
        // 对字段值进行加密,此处使用hutool工具,有其他使用其他即可
        AES aes = SecureUtil.aes(key.getBytes(StandardCharsets.UTF_8));
        String secretStr = aes.encryptHex(parameter);
        ps.setString(i, secretStr);
    }

    /**
     * 获取值内容
     */
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String value = rs.getString(columnName);
        if(Objects.isNull(value)){
            return null;
        }
        // 对字段值进行加密,此处使用hutool工具,有其他使用其他即可
        AES aes = SecureUtil.aes(key.getBytes(StandardCharsets.UTF_8));
        return aes.decr
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值