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
如果改写成这种,这也是我现在的方案
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';
一定程度可以绕过了
应该怎么处理呢
1
annielong 2020-11-19 18:03:39 +08:00
习惯上最外层再套一个 select 进行处理
|
3
RRRoger 2020-11-19 18:29:10 +08:00 1
```sql
SELECT phoneNum_hide FROM (SELECT mask(phoneNum,8,11,*) AS phoneNum_hide, phoneNum AS phoneNum FROM TABLE) t WHERE t.phoneNum = '13800001111'; ``` 这样呢 |
5
xuanbg 2020-11-19 18:42:39 +08:00
脱敏函数只接受一个 phoneNum 不就好了吗?
select mask(phoneNum) phoneNum from table t where t.phoneNum = '13800001111'; |
7
yangzh 2020-11-19 23:34:48 +08:00 via iPhone
数据库里面弄一个脱敏视图,然后所有 select 都只走脱敏视图,保证没有任何办法查到敏感数据
|
8
buliugu 2020-11-20 09:38:06 +08:00
釜底抽薪,直接写个 mask jbdc driver 吧,做一遍 sql parser 自动改写所有涉及字段的 sql
|
9
zczy OP |
10
zczy OP |
15
dayeye2006199 2020-11-20 15:11:22 +08:00
select phoneNum from (select mask(phoneNum,8,11,*) from table where t.phoneNum = '13800001111');
where 放在里面可不可以呢? |
16
zczy OP @dayeye2006199
当然不可以啦 with t1 as (select name from emps union select name from depts) select name from t1 你看一下这种类型的 sql ``` @Test public void sqlTest4() throws Exception { String originSql = "with t1 as (select name from emps union select name from depts) select name from t1"; String expectSql = "with t1 as (select hash_fun(1, 5, emps.name, '*') as name\n" + "from sales.emps as emps\n" + "union\n" + "select hash_fun3(1, 7, depts.name, '*') as name\n" + "from sales.depts as depts) (select t1.name\n" + "from t1 as t1)"; String maskSql = qs3.getMaskSql(originSql); compareSql(maskSql, expectSql); } ``` 如果后面有 where 语句的话 |
17
gengzi 2020-11-20 17:21:52 +08:00
你这个是查询 sql,返回脱敏的 sql ?
|
18
zczy OP |
20
buliugu 2020-11-21 12:17:26 +08:00
@zczy 一样啊,subquery factoring 语法也是可以通过 ast 发现的,说白了使用这种模式做 data masking,就是苦力活,sql 所有可能查询到数据的语法都得 hook 掉。。更要命的是不同数据库语法不一样(逃
|
21
zczy OP |
22
laminux29 2020-11-21 21:41:29 +08:00
你们数据脱敏居然还敢在同服务器甚至同一个库上操作,真有你的,这种最容易因各种漏洞甚至 Hack 而出问题。
专业的做法是,另找一台服务器,专用于脱敏,上面安装一个数据库。然后由原数据库主动把脱敏后的数据,推送到脱敏专用服务器上的专用数据库。只能推,拉都不行。 |
23
dorothyREN 2020-11-22 10:26:27 +08:00
接口做脱敏不行吗,为啥非得用 sql
|
25
zczy OP @dorothyREN 这个是个人开源项目
|
26
yzdobest 2020-11-22 22:23:14 +08:00 via Android
想问下这个使用场景是什么样的?用户传入 sql 吗
|