现在公司项目,用户表有两万六千左右用户,身份证、手机号是采用明文存储的
接到公安部整改通告,需要将身份证、手机号进行加密存储
项目涉及的架构:springboot 、mybatis-plus 、Mysql 5.7
小弟没有这方面的经验,目前有几个担心的地方:
1 、接口怎么改造,网上搜到的教程,有用插件的,有继承 mybatis 拦截器的,有没有大佬讲讲实现的思路,或者自己的经验呀
2 、改造接口,进行加密存储,那么读取和查询(模糊查询)之类的怎么处理
3 、改造好接口,那么两万多条老数据怎么更新成加密后的数据
目前想到的就是这些,小弟技术确实菜,也在网上搜了很多资料参考,包括 ChatGPT 也查找过,还是希望能得到一些大佬的实际经验教导,再次感谢
参考了一个毕竟完整的方案,但是有个缺点,不能用查询构造器: https://blog.csdn.net/qq_33204709/article/details/129178188
1
RainCats 2023-05-16 16:47:15 +08:00 1
方案比较 low ,一时间只想到这些,当然如果流量比较大,数据比较多,就肯定不用看了!
1 、可以用常规的接口入参出参加解密方案,也就是实现 RequestBodyAdviceAdapter 、ResponseBodyAdvice 两个接口,配合自定义注解搞掂 2 、模糊查询可以采用先按其他条件查询过滤数据,然后在代码中做身份证字段的模糊匹配,最后收集符合条件的 id 去做分页查询或者是响应符合条件的数据 3 、旧数据:可以写个隐藏接口来对已有数据做加密处理 |
2
RainCats 2023-05-16 16:50:09 +08:00 1
mybatisplus 有个接口:MetaObjectHandler
这里可以对数据做一些自定义处理 |
3
wmlz 2023-05-16 16:55:02 +08:00 1
1. mybatis 有 typehandler 组件, 可以实现自动转换
2. 模糊查询可以参考这个文章 https://blog.csdn.net/zhiyikeji/article/details/127617913 |
4
huiyadanli 2023-05-16 16:55:09 +08:00 1
这个我有经验,在 DAO 层用 Mybatis 的 TypeHandler 是最方便的解决方案
https://github.com/ztrun/mybatis-crypt-helper 示例代码,自己 clone 了去修改集成到你们公司项目里即可 1. 查询条件中有加密字段时候要考虑到新老数据并行运行,用 or 输入加密前 /加密后的数据 2. 历史数据新写个任务自己跑,才 2w 数据而已 |
5
Habyss 2023-05-16 17:26:34 +08:00
你贴的这个链接是个很好的解决方法呀, 查询构造器的话, 之后用的时候就手动转换一下呗, 涉及加解密字段的地方应该不会很多.
模糊查询的话, 如果不是`刚需`的话, 直接砍掉好了, 为了模糊查询而做的一些设计, 个人感觉大材小用了 |
6
Ufo666 2023-05-16 17:33:15 +08:00
hhhh 我去年也接到了工信部的通知,不得随意存储用户隐私信息,然后我就把用户名性别全删了,手机号用 aes 加密存储了,读取时解密,不知道行不行,因为到现在过了半年了都还没来审。如果我方案不行,求大佬立即踢醒我。
|
7
timepast 2023-05-16 17:49:47 +08:00
有查询需求吗?
|
9
linjiece543 2023-05-17 12:17:42 +08:00 via Android
说个题外话,盲猜跟去年上海数据泄露那个事相关
|
10
veike 2023-05-17 12:33:06 +08:00 via Android
为什么这个帖子讨论的人这么少,顶一下!
|
11
Wh1te 2023-05-17 13:38:56 +08:00
1 、用 Mybatis 拦截器,支持入参加密,返回值解密,可以参考这个项目: https://github.com/WhiteDG/mybatis-crypto
3 、两万多条数据写个刷数据的脚本执行应该也很快的。 |
12
yxisenx 2023-05-18 09:55:39 +08:00
typehandler +1, 注意旧数据处理就好了
|
13
HelloAmazingW 2023-05-21 21:47:32 +08:00
上个月搞过,数据库用 KMS 对敏感数据加解密,前端传过来的数据继承 Interceptor 调用 KMS 进行加解密。
|
14
Jacian 2023-05-30 00:41:59 +08:00
去年做过敏感数据治理,提供一下个人解决思路,整体思路是通过 mybatis 拦截器对条件进行加密,查询拦截器对查询结果进行解密(不支持模糊),仅供参考
1 、加密:statement#prepare 阶段拦截,此拦截器主要处理对查询参数、insert 语句的加密,使用 SQL parse 对 SQL 进行解析,根据占位符获取到字段名以及通过下标获取到 mybatis 值进行加密 2 、解密:拦截 query 方法,将返回的对象根据 resultMap 配置或者驼峰下划线转换找到需要解密属性进行解密并重新赋值 3 、不停机处理:通过配置,对部分字段解密失败返回未解密的值;加密阶段直接跳过配置字段处理 4 、踩坑:pagehrlper 一次查询会同时发起一次 count 查询和一次数据查询,存在 mybatis 中 MetaObject 复用的情况,需特殊处理 由于需要给多业务系统使用,所以原方案设计复杂,整体思路基本如此,可根据自身情况做调整 |