采用TypeHandler对隐私数据自动加解密

news/2025/2/25 20:36:23

前言

当我们写项目的时候,要对隐私数据进行加密和解密操作,可以不用每次都手动去写加密解密的代码,可以用Mybatis的TypeHandler来解决。

TypeHandler

具体意思就是,当我们处理某些特定字段时,可以在这个类里面实现一些方法,让Mybatis遇到这些特定字段可以自动运行处理。(不过使用之前要在application.properties文件里面加一个配置:mybatis.type-handlers-package=org.example.cqqtest.dao.handler)也就是你自己类型处理器路径

java">@MappedTypes(Encrypt.class)//指定该类型处理器处理的Java类
@MappedJdbcTypes(value = {JdbcType.VARCHAR})//指定该类型处理器处理的JDBC类型为VARCHAR
public class EncryptTypeHandler extends BaseTypeHandler<Encrypt> {
    private static final byte[] keys = "1234567890abcdef".getBytes();

    /**
     *
     * @param ps 预编译语句
     * @param i 索引
     * @param parameter 要加密的数据
     * @param jdbcType 数据类型
     * @throws SQLException
     */
    //加密
    @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);;
        ps.setString(i, aes.encryptHex(parameter.getValue()));
    }
    //解密
    @Override
    public Encrypt getNullableResult(ResultSet rs, String columnName) throws SQLException {
        System.out.println("获取值得到的加密数据"+rs.getString(columnName));
        return decrypt(rs.getString(columnName));
    }

    @Override
    public Encrypt getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        System.out.println("获取值得到的加密数据"+rs.getString(columnIndex));
        return decrypt(rs.getString(columnIndex));
    }

    @Override
    public Encrypt getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        System.out.println("获取值得到的加密数据"+cs.getString(columnIndex));
        return decrypt(cs.getString(columnIndex));
    }
    private Encrypt decrypt(String value){
        if(!StringUtils.hasText(value)){
            return null;
        }
        return new Encrypt(SecureUtil.aes(keys).decryptStr(value));
    }
}

Encrypt

在@MappedTypes(Encrypt.class)这个注解中,括号里面的就是指定处理器要处理的Java类,当有的属性是Encrypt类型的时候,就会自动加密解密。

java">@Data
public class Encrypt {
    private String value;
    public Encrypt(String value) {
        this.value = value;
    }

}

加密

以插入数据为例,手机号是要加密的数据,代码就可以这样写。

java">@Data
public class FindUserDo {
    private int id;
    private String password;
    private Encrypt phone;
    private String sex;
}
java">
    public AddUserDto addUser(AddUserParam user) {
        AddUserDo adduserDo = new AddUserDo();
        adduserDo.setName(user.getName());
        adduserDo.setPassword(DigestUtil.sha256Hex(user.getPassword()));
        adduserDo.setPhone(new Encrypt(user.getPhone()));
        adduserDo.setSex(user.getSex());
        userMapper.insertUser(adduserDo);
        AddUserDto addUserDto = new AddUserDto();
        addUserDto.setId(adduserDo.getId());
        return addUserDto;
    }

解密

java"> public FindUserDto getUser(int id) {
        FindUserDo findUserDo = userMapper.selectUser(id);
        FindUserDto findUserDto = new FindUserDto();
        findUserDto.setId(findUserDo.getId());
        //解密手机号
        findUserDto.setPhone(findUserDo.getPhone().getValue());
        findUserDto.setName(findUserDo.getName());
        findUserDto.setSex(findUserDo.getSex());
        return findUserDto;
    }

效果展示

最后,我们可以用postman来进行测试,看看效果


http://www.niftyadmin.cn/n/5865928.html

相关文章

前端面试题---vue和react的区别

文章目录 框架 vs 库&#xff1a;学习曲线&#xff1a;模板 vs JSX&#xff1a;数据绑定&#xff1a;状态管理&#xff1a;性能&#xff1a;社区支持&#xff1a; 框架 vs 库&#xff1a; Vue 是一个完整的框架&#xff0c;提供了从模板到状态管理的全套解决方案&#xff1b;R…

全面理解-深拷贝与浅拷贝

在 C 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09; 和 浅拷贝&#xff08;Shallow Copy&#xff09; 是两种完全不同的对象拷贝策略&#xff0c;主要区别在于对指针和动态分配资源的处理方式。正确理解二者的区别是避免内存泄漏、悬空指针和程序崩溃的关键。 一、核…

人工智能 阿里云算力服务器的使用

获取免费的阿里云服务器 阿里云免费使用地址&#xff1a; https://free.aliyun.com/ 选择 人工智能平台 PAI 选择交互式建模 再选建立实例。 选择对应的GPU 和镜像&#xff0c;点击确认。 注意&#xff1a;250个小时&#xff0c;用的时候开启&#xff0c;不用的时候关闭&…

虚拟机PING不通百度?NAT是什么?什么仅主机?

在虚拟机经常遇到一些网络问题&#xff0c;我也遇到了很多问题&#xff0c;在经过无数次试错后&#xff0c;我对这些有了一定的了解&#xff0c;和解决方式&#xff0c;下面我来谈谈我的经验&#xff0c;如有错误&#xff0c;请轻喷 下面都是我的口语&#xff0c;非正式&#…

LabVIEW中CFURL.llb 工具库说明

CFURL.llb 是 LabVIEW 2019 安装目录下 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\ 路径下的工具库&#xff0c;主要用于处理 LabVIEW 与 URL 相关的操作&#xff0c;涵盖 URL 解析、HTTP 请求发送、数据传输等功能模块&#xff0c;帮助开发者…

屏幕闪烁,相机能不能达到人眼视觉效果

你看着一个灯&#xff0c;光线稳定。然后你用相机拍照&#xff0c;结果发现有时并无光线。 你看着电子屏有字&#xff0c;用手机照相&#xff0c;只有部分字。如附图。 我想问&#xff0c;能不能从技术上改进&#xff0c;让照片、录像屏幕达到人眼视觉效果&#xff1f;

图像处理案例06 OCR应用

OCR应用 1 OCR读取账单1.1 背景及思路1.2 代码 1 OCR读取账单 1.1 背景及思路 思路 目标是读取图片中账单的信息。首先要截取图片上的账单&#xff0c;考虑到账单并非都是整齐摆放&#xff0c;为了保持算法的通用性&#xff0c;通过透视变换对扣取的账单摆正&#xff0c;然后调…

Unity汽车笔记

汽车的移动和转向 我们知道&#xff0c;汽车的前进后退是变速运动。按w&#xff0c;汽车开始加速&#xff0c;到最大速度后保持匀速&#xff0c;松开w&#xff0c;汽车受到阻力加速。如果按s减速&#xff0c;则以更大的加速度减速。后退反之。 按A/D时前轮偏转。只有前进后退…