企业在部署DLP系统,作为技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。
身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。
根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。
这一部分比较简单,在DLP后台配置一些敏感关键字或者正则表达式如mobile号、Bank card号、ID号等等。然后结合其他综合检测手法比如敏感词命中的次数、命中的频率、泄露的源等来判断是否存在泄露行为进而告警。
对获取到的从企业内部发送到企业外部的文档信息,需要检测这些信息中是否包含有企业机密文档库中的内容信息,如果判定是泄漏内容,需要对该信息进行拦截,避免产生泄漏事件。
a) TF-IDF算法
首先介绍下TF-IDF算法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度即权重(weight)。TF(Term Frequency,缩写为TF)也就是词频,即一个词在文中出现的次数。IDF(逆文档频率 Inverse Document Frequency,缩写为IDF),有了词频还不能完整的反映这个词在重要性,我们还需要计算这个词的权重。
举个简单的例子就能明白,假如现在有一份疑似文档,我们要排序出来文档中的重要的词语。假定文章有1000个词语,”的”、”公司”、”财报”、”工资”分别出现50、8、5、9次,那么它们的词频分别为,0.05、0.008、0.005、0.009,很显然”的”是汉语常用字它并不能代表什么意思,所以词频并不能标识”的”在文章中的重要性。那么这个时候我们要计算一下这些词语的逆文档频率,google搜索”的”,有14,560,000,000个条搜索记录,我们暂且把这个当成中文语料库文档总数。然后搜索其他词查出包含该词的文档数分别为,3,420,000,000、 52,300,000、212,000,000,通过下面公式可以计算出这几个词语的TF-IDF。
从该表中可以明显看出在这个文档中”财报”、”工资”是重要的词语也即很有可能是敏感数据。
词语 | 文章中出现次数 | 包含该词的文档数 | TF | IDF | TF-IDF |
---|---|---|---|---|---|
的 | 50 | 14,560,000,000 | 0.05 | 0 | 0 |
公司 | 8 | 3,420,000,000 | 0.008 | 0.63 | 0.0050 |
财报 | 5 | 52,300,000 | 0.005 | 2.44 | 0.0122 |
工资 | 9 | 212,000,000 | 0.009 | 1.84 | 0.0166 |
b)simhash算法
上面通过TF-IDF算法我们可以获取到排名前20个权重词和对应的权重。接下来如何判断两个文档内容的相似度呢?如果我们仅仅是根据这20个词来做hash比较又或者通过其他摘要来做hash比较。显然,即使存在微小差别的不同文档也会得到完全不同的散列值。而我们在相似性检测的目的,不仅仅是判定两篇文档是否完全相同,更主要是的确定二者之间的相似程度高低。因此,我们需要这样一个哈希函数,当输入的文本内容较为相近时,得到的指纹间距离也较为相近。
具有哈希算法的降维优势,又因局部敏感特性而体现相似程度simhash算法正适合本文的研究需求。接下来通过一个python的demo来演示下simhash的基本原理。
Simhash算法是基于关键词序列和权重的计算过程,经过文本特征(关键词息)提取、指纹生成和指纹索引匹配三个数据处理步骤。首先,该算法通过hash函数将文本的多个特征关键词映射到特定维数的向量空间中,得到一组以词语信息为编码的向量;接着,通过对词向量进行加权处理,生成带有权值的向量模型;然后,把所有的向量按对应维度累加在一起,根据各维度上的正负方向,确定对应编码位置的取值,由此得到文本的simhash指纹,即完成了文本信息的降维压缩过程。最后根据二进制字符串比对的海明距离方法,计算两个指纹间的相似度,重合的位数越多,则指纹间相似度越高,也就代表着对应文本相似度越高。而在大规模文本检测系统中,不再仅仅是比较两个指纹的距离,需要同海量的指纹码进行比较匹配。
Simhash基本原理:
(1) 通过TF-IDF算法我们可以获取到排名前20个权重词(feature)
和对应的权重(weight),形成长度20的**(feature:weight)
(2)对每个词进行hash,得到一个64位的的二进制hash
(3)hash中”1”替换成+ weight, ”0”替换成-weight,形成一个列表。
(4)20个列表进行相加
(5)相加后的列表,如果元素为负值的时候用0替换这个元素,反之用1替换。这样就得到这个文档的simhash值了。
(6)两个文档都进行上面5个步骤的操作,最终生成两个simhash。两个simhash取异或,看其中的1是否超过一个阀值(比如3),如果超过阀值我们认为相似度不大。
这里我们通过一个python的demo来演示下。
首先选取三段内容,content2在content的基础上改了一些词语,实际工作中有的人为了外传文档也喜欢用这种掩耳盗铃的方式。Content3则是另外一个与content内容完全不相关的文档内容。
content=”’ 年度企业年度财务分析报告20xx年,通过财务管理规定、内部控制会计制度和银行账户短信银行业务 (账户动帐实时信息和异常预警通知)的建立及执行,已做到会计、出纳分设,帐、款分管,预留银行印鉴和转账、现金支票分别保管,并记有银行存款日记账,按时与银行进行核对,有效杜绝了每笔业务及会计、出纳业务一人经办,最大限度保证财政资金使用安全、规范、有效。全年完成一般预算收入xx万元,为年初预算数xx万元的xx%,较上年完成的xx万元增收xx万元,增长xx%。
”’content2=”’年度公司年度财务分析报告2020年,通过财务管理决定、内部控制会计制度和银行账户短信银行业务 (账户动帐实时信息和异常预警通知)的建立及执行,已做到会计、出纳分设,帐、款分管,预留银行印鉴和转账、现金支票分别保管,并记有银行存款日记账,按时与银行进行核对,有效禁止了每笔业务及会计、出纳业务一人经办,最大限度保证财政资金使用安全、规范、有效。全年完成一般预算赚钱xx万元,为年初预算数xx万元的xx%,较上年完成的xx万元增收xx万元,增长xx%。
”’content3=”’2018年公司财务报告,计划财务部认真完成了全年财务核算,并及时提供了各项准确有效的财务数据,基本上满足了公司及外部有关单位对我部的财务要求。下面向集团公司汇报一下计划财务部xx年的工作情况。今后,计划财务部的工作重点,主要还是加强管理,严格执行中央、省以及公司各项规定,对集团公司的财务进行积极有效的监督管理。 ”’
1、通过jieba.cut进行中文分词,将文档内容分为一个个的词语。
2、jieba.analyse.set_stop_words,设置一些需要被过滤的词语,比如无意义的“的”、”啊”等
3、jieba.analyse.extract_tags ,这里执行TF-IDF算法将前20位的权重词以及权重提取出来。
4、遍历所有权重词,计算64位hash
5、判断hash中为0则替换成-weight ,为1则替换成+weight
6、20个列表进行相加得到list1
7、相加后的列表,如果元素为负数则用0替换,反之用1替换。得到了simhash就是这个文档的simhash了。
8、两个文档的simhash做异或计算,并判断运算后的结果”1”有几个即可得到两个文档的海明距离。
运算结果:
content:
结论:
r12:两个文档相似,海明距离为 1
r13:两个文档不相似,海明距离为 35
完整python脚本:
jiebajieba.analysenumpy npjsonsimhash:
__init__(self, content):
self.simhash = self.simhash(content)
__str__(self):
str(self.simhash)
simhash(self, content):
seg = jieba.cut(content)
jieba.analyse.set_stop_words()
keyWord = jieba.analyse.extract_tags(
.join(seg), topK=20, withWeight=, allowPOS=()) # keyList = []
feature, weight keyWord:
weight = int(weight * 20)
feature = self.string_hash(feature)
temp = []
i feature:
(i == ):
temp.append(weight)
:
temp.append(-weight)keyList.append(temp)
list1 = np.sum(np.array(keyList), axis=0)
print(list1)
(keyList == []): #
simhash = i list1:
(i > 0):
simhash = simhash + :
simhash = simhash + simhash
string_hash(self, source):
source == :
0
:
x = ord(source[0]) << 7
m = 1000003
mask = 2 ** 128 - 1
c source:
x = ((x * m) ^ ord(c)) & mask
x ^= len(source)
x == -1:
x = -2
x = bin(x).replace(, ).zfill(64)[-64:]
print(source, x)
str(x)hammingDis(self, com):
t1 = + self.simhash
t2 = + com.simhash
n = int(t1, 2) ^ int(t2, 2)
i = 0
n:
n &= (n - 1)
i += 1
i>3:
% (i)
:
% (i)
content=content2=content3=simhash1=simhash(content)
simhash2=simhash(content2)
simhash3=simhash(content3)
r12=simhash1.hammingDis(simhash2)
r13=simhash1.hammingDis(simhash3)print(,r12)print(,r13)
实操指南:如何监控聊天中的敏感信息?这款秘籍软件,轻松掌握微信聊天动态
电影《摩登时代》里,流水线工人就连在吃饭时都要用“自动喂食机”提高效率,这样才能挤出更多时间投入工作。虽然现在打工人不至于此,但有些老板仍然放心不下……像企业聊天记录往往蕴含着大量的敏感信息。为了确保信息安全,监控聊天中的敏感信息成为了一项必要且重要的工作。以下是一款秘籍软件,帮助你轻松掌握微信聊天动态,确保信息安全。...
怎么监控员工上班情况?2024企业管理的四种方法,老板们不容错过
怎么监控员工上班情况?2024企业管理的四种方法,老板们不容错过员工上班在干什么?摸鱼?打游戏?老板该怎么管理?如何才能监视怎么监控员工上班情况?监控员工上班情况可以通过多种方式实现,但重要的是要确保这些措施既合法又合规,同时尊重员工的隐私权。以下是一些建议的方法:一、制定明确的行为规范与奖惩制度1、制定行为规范: 企...
怎么监控员工上班情况?快速监控员工状态
怎么监控员工上班情况?快速监控员工状态在企业管理中,如何有效监控员工上班情况,确保工作效率与团队协作,是每位老板都需面对的课题。本文为您揭秘五招快速监控员工状态的实用技巧,不仅能帮助您实时掌握员工动态,还能提升整体管理效率。作为老板,掌握这些技巧,将让您在企业管理中游刃有余,轻松应对各种挑战。一、使用安企神软件实时监控...
安企神桌管软件:提升企业管理效率的全能助力
安企神桌管软件:提升企业管理效率的全能助力在当今竞争激烈的商业环境中,企业必须不断优化管理和运营流程,以提高效率和盈利能力。安企神桌管软件正是这样一款面向中小企业的管理工具,能够帮助企业在多方面提升综合管理水平。本文将详细探讨安企神桌管软件给企业带来的多重价值。一、全方位的管理功能安企神桌管软件是一款集成了多种管理功能...
安企神:揭开终端安全管理软件的神秘面纱
安企神:揭开终端安全管理软件的神秘面纱在数字化日益普及的今天,企业的网络安全问题愈发显得重要。数据泄露、网络攻击等事件层出不穷,如何保障企业内部信息的安全性成为众多企业关心的焦点。安企神终端安全管理软件应运而生,作为一款专业的安全管理工具,它的功能与优势备受关注。本文将全面揭秘安企神软件的核心功能、应用场景及其在终端安...