当前位置: 首页 > news >正文

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

前言

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

TypeHandler

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

@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类型的时候,就会自动加密解密。

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

}

加密

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

@Data
public class FindUserDo {
    private int id;
    private String password;
    private Encrypt phone;
    private String sex;
}

    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;
    }

解密

 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来进行测试,看看效果

相关文章:

  • hot100-二叉树
  • 20分钟 Bash 上手指南
  • 【STL】5.<set/multiset>
  • LeetCode 每日一题 2025/2/17-2025/2/23
  • Dify私有化部署自己的AI Agent
  • 【算法】堆
  • linux 文件系统和软硬链接
  • 【数据结构】B树家族详解:B树、B+树、B*
  • 【NLP 38、激活函数 ④ GELU激活函数】
  • Week1_250217~250223_OI日志(待完善)
  • 2025 银行业科技金融创新与发展报告
  • vLLM专题(十二)-推理输出(Reasoning Outputs)
  • 回合制游戏文字版(升级)
  • 【GreenHills】GHS合并库文件
  • 2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(一)
  • ROS ur10机械臂添加140夹爪全流程记录
  • Android Studio超级详细讲解下载、安装配置教程(建议收藏)
  • 第二章:辅助功能
  • FFmpeg进化论:从av_register_all手动注册到编译期自动加载的技术跃迁
  • 高中数学基础-平面向量
  • 因港而兴,“长江黄金水道”上的宜宾故事
  • 微软将在全球裁员6000人,目标之一为减少管理层
  • KPL“王朝”诞生背后:AG和联赛一起迈向成熟
  • 市场监管总局等五部门约谈外卖平台企业
  • 体坛联播|安切洛蒂执掌巴西男足,字母哥尝试离开雄鹿
  • 牛市早报|中美日内瓦经贸会谈联合声明公布