问题:
对会员信息进行加密保存到数据库中
解决方案:
使用mybatis的拦截器拦截对象解密展现到界面中,将对象加密保存到数据库中
执行方案的充分必要条件
- 保证密钥不进行修改,如果需求更改为需要动态修改密钥,就需要进行二次开发
- 注册拦截器
影响:
- 数据库中的敏感数据得到加密,提高安全性
- 每次执行sql语句时都会触发到拦截器,给后台服务器增加压力
- 在解密数据和加密数据时,会导致用户等待时间增加
针对对象:
所有经由mybatis层执行的sql语句(不包括hibernate和jdbc)
触发的条件:
- 更新、插入、查询等操作
- 操作参数中对象带有加密解密的注解
使用的工具:
mybatis拦截器(插件)
涉及到的代码处(逻辑上)
- 拦截器:AESInterceptor
- 注解类:DecryptField、EncryptField
- 枚举类:CorpMemberUpdateFlag
- 更新的通用工具类:UpdateUtils
- service层:CorpMemberService
- controller层:CorpMemberController
- 注册mybatis的xml文件:mybatis-config.xml
具体实现逻辑
- 创建加密解密的注解
- 创建拦截器,拦截dao层的sql语句,判断拦截下来的sql操作
- 如果是查询或者插入操作,就判断拦截下来的参数中是否有加密的注解,如果有,就对带有加密注解的字段的数据进行加密
- 加密的过程中会筛选加了注解的字段的值,是否可以进行加密,
如果该值为空或解密失败、解密成功这三种,就会跳过,不进行加密
如果该值不是16进制或者字符串的长度不能被16整除,都进行加密。 - 然后就执行sql语句
- 判断返回值,如果是集合类型,就进行判断解密条件,否则就直接返回这个对象
- 解密过程中,判断集合中的对象是否存在解密注解,如果存在,就对带有解密注解的字段进行解密。并判断该值是否需要解密
如果该值经过判断后可以解密,才进行解密,否则跳过,并在日志中输出ERROR类型的信息 - 执行完成后,就返回这个值到前端
更正后得到的好处
- 只需要在对象中的字段上添加加密解密的注解,就能实现数据的加密解密
- 只需要在controller中添加对应表的数据更新操作,就能批量更新敏感数据
文章来源: https://blog.csdn.net/weixin_41605123/article/details/96832426