关于hive表查询脱敏,原理是select的时候在后台对sql进行处理,对每个要查询的字段都加一个自定义的mask脱敏函数。
一开始的实现思路是类似 select col1,col2,col3 from mask_table
,后台处理后sql改造成select m.col1,m.col2,m.col3 from (select mask(col1),mask(col2),mask(col3) from mask_table) m
, 优点是实现比较简单,根据spark sql执行的物理计划,获取到sql涉及到的根表,对根表的每个字段进行脱敏。
但以上实现存在问题,假设原sql为select mobile from mask_table where mobile=‘13111111111’
,通过上述方法改造后,sql变成select mobile from (select mask(mobile) from mask_table) a where mobile=‘13111111111’
,当前这种情况已经无法查询结果
最后实现的方式其实一开始就想到了,但是最开始的时候觉得要追溯字段的依赖关系有点不太好弄,所以用了上述方式,不过最后还是改造成了下面的方法:
实现原理一样,也是根据spark sql的物理计划对sql重新进行拼接,不同的是,原来是对根表的每个字段进行脱敏处理,现在对查询结果的每个字段进行脱敏处理。
优点:
1、能根据具体条件查询
2、查询性能相较第一种方式有所提高。
大概实现是:
1、将原始sql改成,sql = “select * from (” + sql + “) m”,原因是用户执行的sql可能会比较复杂,所以在外面又嵌套了一个查询,这样不管原sql多复杂,经过一层嵌套后查询的返回结果字段获取就会比较简单
由于在外面又嵌套了一层查询,所以导致查询有一个缺陷,诸如select a.mobile,b.mobile from tmp_a a left join tmp_b b on a.id=b.id
这样的查询,变成select * from (select a.mobile,b.mobile from tmp_a a left join tmp_b b on a.id=b.id) m
后,会报字段名重复的错误
2、根据spark sql的物理计划获得字段的依赖关系
3、重新拼接sql。
val df = sparkSession.sql(sql)
val query = df.queryExecution
val sparkPlan = query.sparkPlan //从这里可以获取到字段的依赖关系
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/228142.html