基于SQL语句的数据脱敏实现方法

文章目录

  • 要解决什么
  • 背景
    • Jsqlparser
    • 安全系统
    • 难点
    • 目标
  • 方法
    • 语法树遍历
    • 实现
      • 初始化
      • 第一轮
      • 第二轮
      • 第三轮
  • 总结

要解决什么

企业进行软件开发、数据分析、数据查询时,不可避免的涉及到数据安全的问题,不同人员能看到的数据不同,如何识别哪些敏感数据被查询了,或者被通过一些处理后隐性的被查询了是非常重要的。如手机号,直接判断是否查询手机号是十分容易的,但是如果查询时通过两次SQL查询,一次查询前手机号前3位,一次查询后8位,则不易被发现,数据也已泄露。本文介绍如何解决“在SQL使用中发现使用敏感数据泄露的行为”。

背景

Jsqlparser

Jsqlparser是一个用Java编写的SQL解析器,可以将SQL语句解析成语法树,方便开发人员进行SQL语句的分析和操作。目前有很多类似的SQL解析器,此类解析器只能将语句解析为语法树,但是不能使上下层结构的业务逻辑关联在一起,因而它只是一个工具,如何判断最终结果中是否涉及敏感数据的逻辑还需要我们自己编写。

安全系统

目前有一些商用的数据安全系统,包含数据脱敏功能,开源的如archery。此类系统可以识别一定类型的SQL语句,但是只包含简单结构,像包含多层嵌套查询、关联查询、函数处理、casewhen语法时,系统不能检测出。

难点

难点:无法支持复杂的嵌套查询、无法支持函数处理后的数据、无法支持casewhen语法、无法支持union关键字等。

目标

搭建一种易于扩展的SQL分析架构,能够方便的分析SQL语法树,建立上下层嵌套语句间的关系,使得SQL查询过程中能够便捷的支持各种语法,识别出可能的敏感数据泄露行为。

方法

语法树遍历

使用Jsqlparser工具将SQL解析为语法树,选择深度遍历优先算法。有两个重要概念:
一是,敏感数据的传染。
即在深度优先遍历时,先找到最底层的子句,根据from后的数据源找出本子句使用的敏感数据,如果上层父语句使用此数据,则对映数据被传染为敏感数据。
二是,敏感数据表。
即维护一个敏感数据<数据名称,来源表,来源字段>的三元组集合。一开始集合中只包含数据库中的原始字段,我们把敏感数据做一个事前的基础维护。然后在分析语法树的每层结构时,不断增加这个集合的内容,一旦某层的中间数据被传染,则加入到集合中,并记录来源。最后自下而上一层层追溯到顶端,则可以发现全部被传染的敏感数据。

实现

// 数据三元组如下
public class Col {public String srcTable;// 真实来源表public String srcCol;// 真实来源列public String name;// 别名
}
// 数据集合如下
private HashMap<String, Set<Col>> tableMaps = new HashMap<>();

select a.pho,b.money, (select f.name from user_friend f where f.user_id = a.id limit 1) friendName from (select pho from (select phone pho from user t1 where t1.create_time < ‘2023-05-01’) t where t.create_time > ‘2023-01-01’) a join bank b on a.id = b.user_id;为例

初始化

首先初始化中间数据集合,这些初始信息由其他系统认为设置或自动扫描识别得到,如我们设置user表的phone是敏感信息,则初始集合为Col<name:phone,srcCol:phone,srcTable:user>

使用Jsqlparse等工具解析sql为语法树,对语法树进行深度优先遍历,伪代码如下:

public void visit(PlainSelect plainSelect) {//accept(this)递归本方法实现深度遍历PlainSelect sub = findSub(plainSelect.getFromItem());sub.accept(this);List<Join> joins = plainSelect.getJoins();for (Join join : joins) {PlainSelect s = findSub(join.getRightItem());s.accept(this);}for (SelectItem selectItem : plainSelect.getSelectItems()) {PlainSelect sub = findSub(selectItem);sub.accept(this);}
}

第一轮

第一轮处理如下子句,根据集合得知phone为敏感数据,pho虽然重新定义了别名,但其被传染为敏感数据,则集合中增加一条Col<name:t.pho,srcCol:phone,srcTable:user>
(select phone pho from user t1 where t1.create_time < ‘2023-05-01’) t

第二轮

第二轮处理如下子句,根据上一轮集合结果,t.pho为敏感数据,则a.pho也被传染为敏感数据,则集合中增加一条Col<name:a.pho,srcCol:phone,srcTable:user>
(select pho from (select phone pho from user t1 where t1.create_time < ‘2023-05-01’) t where t.create_time > ‘2023-01-01’) a

第三轮

第三轮处理如下子句,根据上一轮集合结果,a.pho为敏感数据,则最终发现a.pho是敏感数据,依此类推。
select a.pho,b.money, (select f.name from user_friend f where f.user_id = a.id limit 1) friendName from (select pho from (select phone pho from user t1 where t1.create_time < ‘2023-05-01’) t where t.create_time > ‘2023-01-01’) a join bank b on a.id = b.user_id;

总结

1、便于逻辑分析,每次只需要解决上下相邻层间的逻辑问题,而不必跨层,大大降低了难度。
2、逻辑结构清晰,多层嵌套问题被切割成了两层语句的问题,便于后期更复杂逻辑的扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统关闭防火墙和SELINUX及配置网络

一&#xff0c;关闭防火墙和SELINUX 当我们进入界面后&#xff0c;输入用户名root&#xff0c;以及密码&#xff0c;密码我们是看不见的 然后输入指令cat -n /etc/sysconfig/selinux &#xff08;注意空格&#xff09; 输入指令 vi /etc/sysconfig/selinux &#xf…

【Python】进阶学习:一文了解NotImplementedError的作用

【Python】进阶学习&#xff1a;一文了解NotImplementedError的作用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

Hashtable、HashMap、TreeMap的区别

了解 Hashtable、HashMap、TreeMap 1&#xff09;Hashtable 是一个比较古老的实现&#xff0c;随 Java 1.0 引入。 它是同步的&#xff0c;这意味着它是线程安全的&#xff0c;但这也意味着它通常比非同步的实现&#xff08;如 HashMap &#xff09;慢。 不允许使用 null 键…

x264编码器 API 函数介绍

x264 x264是一个开源的视频编码库,用于将视频压缩为H.264/AVC(Advanced Video Coding)格式。它是一种广泛使用的视频编码标准,能够提供高质量的视频压缩和较低的比特率。 x264库提供了一个编码器,可以将原始视频序列转换为H.264/AVC压缩的比特流。它实现了各种H.264编码算…

【从Python基础到深度学习】12. 封包、解包

封包 将多个值赋值给一个变量时&#xff0c;Python 会自动将这些值封装成元组&#xff0c;这个特性称之为封包 a 1, 2, 3, 4 print(a) 解包 所有可迭代对象都支持解包 str list tuple dict set reversed range zip enumerate 赋值过程中的解包赋值符号左边变量和右边可迭代…

MongoDB实战面试指南:常见问题一网打尽

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! MongoDB是一款流行的非关系型数据库&#xff0c;以其高效、可扩展的特性受到开发者的青睐。了解MongoDB的架构、存储引擎和数据结…

ETH共识升级之路

简介 根据我们之前的介绍&#xff0c;了解到ETH网络的共识方式&#xff0c;已经从 PoW 切换到了 PoS&#xff0c;今天我们就回顾下升级之路&#xff0c;以及升级带来的影响 最早的共识机制 PoW 以太坊创建之初采用了类似比特币的工作量证明机制&#xff0c;即矿工通过计算哈希函…

java房屋中介(java+SQL2000)-391-(源码+说明资料)

转载地址: http://www.3q2008.com/soft/search.asp?keyword391 任务及要求&#xff1a;  1&#xff0e;设计&#xff08;研究&#xff09;内容和要求&#xff08;包括设计或研究内容、主要指标与技术参数&#xff0c;并根据课题性质对学生提出具体要求&#xff09;  本系统…

知识图谱中的数据服务是什么?

随着信息时代的飞速发展&#xff0c;数据已经成为了各行各业的重要资源。知识图谱作为大数据时代的一种新型数据组织形式&#xff0c;能够将分散、无序的数据进行结构化处理&#xff0c;并建立起相互之间的关系&#xff0c;从而更好地满足人们对知识的需求。而在知识图谱中&…

CircuitBreaker熔断器

CircuitBreaker熔断器 1、Hystrix目前也进入维护模式 ​ Hystrix是一个用于处理分布式系统的延迟和容错的开源库&#xff0c;在分布式系统里&#xff0c;许多依赖不可避免的会调用失败&#xff0c;比如超时、异常等&#xff0c;Hystrix能够保证在一个依赖出问题的情况下&…

C++演变历史

C 从 C 98 版本到今年确定的 C23&#xff0c;共经历了 6 个版本的迭代。上面这张图里&#xff0c;列出了每次版本更新变化的内容。顶部黑体字的大小说明了版本变化的大小&#xff0c;其中 C14 是字体最小&#xff0c;这个版本是 C11 的增量版本&#xff0c;之所以没有大的变动&…

Server-Sent Events (SSE) 实现从服务器到客户端的实时数据流

前期回顾 避免阻塞主线程 —— Web Worker 示例项目-CSDN博客https://blog.csdn.net/m0_57904695/article/details/136721297?spm1001.2014.3001.5501 目录 CSDN 彩色之外 &#x1f4dd; 前言 &#x1f6e0;️ 安装 ✂️ 运行服务器 ✂️ 运行index.html ♻️ 贡献…

身份证查询-身份认证-javascript实名认证接口-

翔云身份证实名认证接口将与网络平台携手共筑信息安全防线&#xff0c;守护每一笔交易的真实可信&#xff0c;助力您的企业在数字化浪潮中稳健前行&#xff01; 以下是javascript语言调用翔云身份证实名认证API的代码&#xff1a; var form new FormData(); form.append("…

引领短剧风尚,打造全新观影体验——短剧APP开发之旅

随着移动互联网的迅猛发展&#xff0c;短视频和短剧成为了大众休闲娱乐的新宠。为了满足用户对于高质量、快节奏内容的需求&#xff0c;我们决定开发一款全新的短剧APP&#xff0c;为用户带来前所未有的观影体验。 这款短剧APP将集合丰富多样的短剧资源&#xff0c;涵盖各种题…

了解什么是 Redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 Redis 的穿透?

目录 一、面试官心理分析 二、面试题剖析 1. 缓存雪崩 2. 缓存穿透 3. 缓存击穿 一、面试官心理分析 其实这是问到缓存必问的&#xff0c;因为缓存雪崩和穿透&#xff0c;是缓存最大的两个问题&#xff0c;要么不出现&#xff0c;一旦出现就是致命性的问题&#x…

B/S基于云计算的云HIS智慧医院管理系统源码带电子病历编辑器

目录 一、系统概述 二、开发环境 三、系统功能 1、门诊部分 2、住院部分 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 云HIS系统&#xff1a;病案首页 云his系统源码 SaaS应用 功能易扩 统一对外接口管理 现如今&#xff0c;大数据、云计算、移动…

c# 编辑、删除一条数据

1、编辑数据 [HttpPost] public MessageModel<string> Put([FromBody] Dtable request) { var data new MessageModel<string>(); request.UPDATETIME DateTime.Now; if (request.ID>0) { …

案例:MySQL 主从复制与读写分离

1.案例环境 一、准备五台主机 Master&#xff1a;操作系统CentOS 7.3x86_74、IP地址192.168.17.10。Slave1&#xff1a;操作系统CentOS 7.3x86_74、IP地址192.168.17.20。Slave2&#xff1a;操作系统CentOS 7.3x86_74、IP地址192.168.17.30。Amoeba&#xff1a;操作系统CentO…

HDOJ 2048

神、上帝以及老天爷 Problem Description HDU 2006’10 ACM contest的颁奖晚会隆重开始了&#xff01; 为了活跃气氛&#xff0c;组织者举行了一个别开生面、奖品丰厚的抽奖活动&#xff0c;这个活动的具体要求是这样的&#xff1a; 首先&#xff0c;所有参加晚会的人员都将一…

python | pop()和remove()方法

pop()与remove()方法都是删除列表中的元素&#xff0c;但删除的位置不同 ① pop()&#xff1a;删除列表中的最后一个元素 ② remove()&#xff1a;可以删除列表中的某一个值 如果某一个值有多个&#xff0c;则删除第一个&#xff08;即最左边出现的那一个&#xff09; li[…