如何使用MyBatis进行数据存储的加密、解密

这篇具有很好参考价值的文章主要介绍了如何使用MyBatis进行数据存储的加密、解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:在大部分的系统中,出于用户的隐私安全考虑,都会对数据库内容进行加密,那么在编写业务代码逻辑时加密也不太现实。于是通用的加解密插件就应运而生,本文将采用mybatis的拦截器作为基础进行实现。

思路:我们可以通过mybatis的拦截器进行参数的加密和解密

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) // 拦截执行方法
  • ParameterHandler (getParameterObject, setParameters) // 拦截参数处理器
  • ResultSetHandler (handleResultSets, handleOutputParameters) // 拦截结果集处理器
  • StatementHandler (prepare, parameterize, batch, update, query) // 拦截sql构建处理器
  1. 两个注解,一个用于实体类(SensitiveData),一个用于实体类的字段(SensitiveField)
  2. 重写mysql的拦截器Interceptor,对数据进行加密和解密
  • 加密:(拦截参数处理器)
@Intercepts({@Signature(type = ParameterHandler.class, method = "setParameters", args = PreparedStatement.class)})
public Object intercept(Invocation invocation) throws Throwable {
    //@Signature 指定了 type= parameterHandler 后,这里的 invocation.getTarget() 便是parameterHandler
    //若指定ResultSetHandler ,这里则能强转为ResultSetHandler
    ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
    log.info("============parameterHandler ==={}", parameterHandler);

    // 获取参数对像,即 mapper 中 paramsType 的实例
    Field parameterField = parameterHandler.getClass().getDeclaredField("parameterObject");
    log.info("============parameterField ==={}", parameterField);

    parameterField.setAccessible(true);
    // 取出实例
    Object parameterObject = parameterField.get(parameterHandler);
    log.info("============parameterObject ==={}", parameterObject);

    if (!Objects.isNull(parameterObject)) {
        Class<?> parameterObjectClass = parameterObject.getClass();
        log.info("============parameterObjectClass ==={}", parameterObjectClass);

        //校验该实例的类是否被@SensitiveData所注解
        SensitiveData sensitiveData = AnnotationUtil.getAnnotation(parameterObjectClass, SensitiveData.class);
        log.info("============sensitiveData ==={}", sensitiveData);

        if (Objects.nonNull(sensitiveData)) {
            Field[] declaredFields = parameterObjectClass.getDeclaredFields();
            aesEncrypt.encrypt(declaredFields, parameterObject);
        }
    }
    log.info("==========proceed==-{}---", invocation.proceed());
    return invocation.proceed();
}

mybatis加密解密,mybatis,mybatis,java,开发语言

  • 解密

    @Intercepts({@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = Statement.class)})
    
public Object intercept(Invocation invocation) throws Throwable {
    // 获取结果
    Object resultObj = invocation.proceed();
    log.info("=====resultObj==={}", resultObj);
    if (Objects.isNull(resultObj)) {
        return null;
    }
    // 判断是否是list
    if (resultObj instanceof List) {
        for (Object resultList : (List) resultObj) {
            aesUtil.decrypt(resultList);
        }
    } else {
        Class<?> aClass = resultObj.getClass();
        SensitiveData annotation = AnnotationUtil.getAnnotation(aClass, SensitiveData.class);
        if (Objects.nonNull(annotation)) {
            aesUtil.decrypt(resultObj);
        }
    }
    return resultObj;
}

mybatis加密解密,mybatis,mybatis,java,开发语言

mybatis加密解密,mybatis,mybatis,java,开发语言

结果:

存储:

mybatis加密解密,mybatis,mybatis,java,开发语言

查询:

mybatis加密解密,mybatis,mybatis,java,开发语言文章来源地址https://www.toymoban.com/news/detail-657990.html

到了这里,关于如何使用MyBatis进行数据存储的加密、解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据加密、解密】前后端数据传输的过程中,如何进行数据加密传输,保证数据的传输安全,防止被他人窃取

       前端进行参数传递的时候 ,有些数据为了安全起见还是需要加密传输的,比如用户密码,比如登录的时候,注册的时候,用户输入的密码,如果明文进行传输还是不太安全的,所以一般可以进行加密后传递到后端。 那么就有这几个问题: ·前端如何进行加密 ·后端如何进

    2024年02月07日
    浏览(56)
  • MyBatis 在大数据量下使用流式查询进行数据同步

    通常的数据同步中,如果数据量比较少的话可以直接全量同步,默认情况下,完整的检索结果集会将其存储在内存中。在大多数情况下,这是最有效的操作方式,并且由于 MySQL 网络协议的设计,因此更易于实现。但是如果数据量很大的话,全量同步需要大量的内存,如果内存

    2024年02月05日
    浏览(35)
  • 认识 MyBatis + MyBatis如何使用 (MyBatis操作数据库)

    本篇介绍了什么是MyBatis,MyBatis的前期配置,MyBatis操作数据库的两种方式:.xml文件 / 注释,使用MyBatis的一些注意,如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 MyBatis(ORM: 对象关系映射框架): 一个持久层框架,也是一个工具实现程序与数据库交互,

    2024年02月14日
    浏览(56)
  • Android 使用sqlcipher加密和解密数据库(包括加密和解密已有的数据库,还有如何查看数据库教程)

    前言 我们知道Android系统有一个内嵌的SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作,SQLite是一个轻量级的、跨平台的、开源的嵌入式数据库引擎,也是一个关系型的的使用SQL语句的数据库引擎,读写效率高、资源消耗总量少、延迟时间少,使其成为移

    2024年02月06日
    浏览(51)
  • MyBatis Plus 数据库字段加密处理

    当项目开发到一半,可能突然客户会要求对数据库里面比如手机号、身份证号的字段进行加密; 在保证开发最快、影响范围最小的情况下,我们需要选择一种介于数据库和代码之间的工具来帮我们实现自动加解密; 这里我们选用AES对称加密算法,因为它是可逆算法。 AES加密

    2024年02月07日
    浏览(60)
  • 解密Mybatis-Plus:优雅简化你的数据访问层!

    目录 1、引言 2、什么是Mybatis-Plus 3、Mybatis-Plus的特点和优势 4、安装和配置Mybatis-Plus

    2024年01月21日
    浏览(35)
  • 基于Mybatis-Plus拦截器实现MySQL数据加解密

    用户的一些敏感数据,例如手机号、邮箱、身份证等信息,在数据库以明文存储时会存在数据泄露的风险,因此需要进行加密, 但存储数据再被取出时,需要进行解密,因此加密算法需要使用对称加密算法。 常用的对称加密算法有AES、DES、RC、BASE64等等,各算法的区别与优劣

    2024年02月16日
    浏览(38)
  • 用java语言写一个AES算法,使用AES(CBC模式)对数据进行加密或解密。加解密用到的密钥(Key)和密钥偏移量(IV),代码实例类编写。

    以下是一个使用Java编写的AES算法实例,使用AES(CBC模式)对数据进行加密和解密。代码中包括了生成随机密钥和密钥偏移量的方法。 java Copy code import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.InvalidAlgorithmParameterException; import

    2024年02月07日
    浏览(60)
  • C#语言基础问题16:C# 中如何进行加密和解密操作?

    在 C# 中,可以使用以下几种常见的加密算法进行加密和解密操作: 对称加密算法:使用相同的密钥对数据进行加密和解密,常见的对称加密算法有 DES、3DES、AES 等。 非对称加密算法:使用公钥和私钥进行加密和解密,常见的非对称加密算法有 RSA、DSA 等。 散列算法:将数据

    2024年02月13日
    浏览(34)
  • Mybatis读取和存储json类型的数据

    不管数据库当中是以json还是longtext数据类型来存json,都可以在mybatis当中使用string来接数据。这一点毋庸置疑!但是想要使用JSONObject类型的字段来取值是否可以呢? 接下来我们来测试一下,我用的是mybatis-plus框架,mybatis-plus和mybatis是一样的,无非就是mybatis-plus封装好了一些

    2024年02月02日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包