sql 改写类的数据脱敏遇到的问题求助

2020-11-19 18:00:10 +08:00
 zczy

https://github.com/xylou/sqlMask

为了找工作写的一个开源项目,但是觉得有点问题了

是通过改写 sql 来做的数据脱敏

比如要查询 phoneNum,phoneNum 配置了策略是隐藏最后四位,mask(col,8,11,*)

select phoneNum from table

那改写 sql 的结果就是

select mask(phoneNum,8,11,*) phoneNum from table

如果是上面的这种普通 sql 还比较好处理

但是现在有这么个问题,比如下面这种类型的 sql

  1. select phoneNum from (select phoneNum from table) t where phoneNum = '13800001111';

如果改写成这种,这也是我现在的方案

select phoneNum from (select mask(phoneNum,8,11,*) phoneNum from table) t where t.phoneNum = '13800001111';

那其实就有问题了,where 语句是有问题的

如果改写成这种:

select mask(phoneNum,8,11,*) phoneNum from (select phoneNum from table) t where t.phoneNum = '13800001111';

那数据安全就不能保证,因为我可以写下面这种 sql 查到原始数据

select phoneNum from (select '12345678900' + phoneNum as phoneNum from table) t where phoneNum = '13800001111';

一定程度可以绕过了

应该怎么处理呢

2448 次点击
所在节点    程序员
27 条回复
zczy
2020-11-21 16:21:19 +08:00
@buliugu
如果是嵌在整个执行计划中,要适配不同的数据存储,可能也不太行

有的比较复杂的 sql 语句估计还是会有脱敏后计算的场景
laminux29
2020-11-21 21:41:29 +08:00
你们数据脱敏居然还敢在同服务器甚至同一个库上操作,真有你的,这种最容易因各种漏洞甚至 Hack 而出问题。

专业的做法是,另找一台服务器,专用于脱敏,上面安装一个数据库。然后由原数据库主动把脱敏后的数据,推送到脱敏专用服务器上的专用数据库。只能推,拉都不行。
dorothyREN
2020-11-22 10:26:27 +08:00
接口做脱敏不行吗,为啥非得用 sql
zczy
2020-11-22 16:08:36 +08:00
@laminux29 你这个是数据脱敏,也有的

我们现在是策略脱敏,原数据是干净的
zczy
2020-11-22 16:09:10 +08:00
@dorothyREN 这个是个人开源项目
yzdobest
2020-11-22 22:23:14 +08:00
想问下这个使用场景是什么样的?用户传入 sql 吗
zczy
2020-11-23 11:26:53 +08:00
@yzdobest 我个人设想是这样的

不同的用户有不同的策略,也就是配置了不同的 udf 函数

使用同一个 sql 语句,执行查询出来的结果看到的不一样

然后数据源是干净的,不是脱敏后的数据

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/727240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX