写在前面
好记性不如烂笔头,很多知识久了不用会渐渐生疏,故此以文章的形式进行记录。但干干的知识点又不符合本人的风格,故此产生了Safety,一个主要用于记录学习Mybatis和SpringBoot的项目。
Safety 是基于Mybatis实现的加解密插件,这不是一个正式的项目(至少现目前不是),主要是用于整理记录本人的学习成果。故此本文不是教学类文章,基本不会进行原理上的分析阐明或源码流程分析。
Safety 是基于Mybatis的加解密插件,可以通过注解配置的方式,实现字段级的自动加解密功能。
前置知识
环境准备
-
java :jdk17
-
ide : IntelliJ IDEA 2021.3
-
spring-boot: 2.6.6
-
mybatis-spring-boot-starter:2.2.2
设计思想
mybatis 本身提供了插件(plugins)功能,它允许我们在映射语句执行过程中的某一点进行拦截调用,基于此我们可以实现 Interceptor 接口来完成加解密功能,大体思想即是在数据操作前通过拦截器对需要进行加密的数据进行加密替换,在返回数据前对需要解密的数据进行解密。
mybatis本身提供了四个拦截点:
-
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
-
ParameterHandler (getParameterObject, setParameters)
-
ResultSetHandler (handleResultSets, handleOutputParameters)
-
StatementHandler (prepare, parameterize, batch, update, query)
我们可以在仅对Executor进行拦截,在proceed前对参数进行加密,在proceed后对返回的数据进行解密;但出于设计和职责考虑,还是将加解密分开来进行处理。
加密
我们对上面的大体设计稍微进行一点补充,其设计如下:
解密
同理,解密设计如下:
总结
加解密的大致设计就是依托于mybatis提供的intercepter接口进行拦截修改,目前整个设计大体思想是有了,但还很粗糙,后续我们会一边代码实现,一边进行设计重构。