0x00 背景
文档中敏感信息识别。不限于word, pdf 等文件格式中的敏感信息及其中的图片敏感信息识别。
0x01 识别原理
以word文档为例
.docx文件有很多种结构,这些结构在python-docx中用3种不同的类型来表示:最高一层是Document对象表示文档,每个Document对象包含一个Paragraph 对象也就是段落组成的列表,而每个Paragraph对象则包含一个Run对象的列表
一个Run对象是具有相同格式的文本,当发生变化的时候就需要一个新的Run对象
个人觉得读取全部文档信息,然后用正则匹配效率比较高。
word 或 pdf 里面有图片的情况,涉及到数字图像处理技术。(图片里的敏感信息)
0x02 实现
用到一个库 python-docx
#!pip install python-docx - -user
import docx
import os
print(os.getcwd())
file = docx.Document("test.docx")
''' # test.docx #经测试,还得是个docx文档,doc不行
Test数据
匹配数据
Test
Test 敏感信息
'''
print("打印文件行数:" + str(len(file.paragraphs)))
print("打印第1行: " + file.paragraphs[0].text)
print("打印第1行长度: " + str(len(file.paragraphs[0].runs)))
print("打印第3行长度: " + str(len(file.paragraphs[2].runs)))
print("打印第5行长度: " + str(len(file.paragraphs[4].runs)))
print("打印第7行长度: " + str(len(file.paragraphs[6].runs))) # 空格注意
for i in range(2):
print(file.paragraphs[0].runs[i].text) # 只有len 2
print("----------")
for i in range(3):
print(file.paragraphs[6].runs[i].text) # 只有len 3/4
print("----------")
# 看样子是根据大小写等样式来区分段落的
def getText(fileName):
doc = docx.Document(fileName)
TextList = []
for paragraph in doc.paragraphs:
TextList.append(paragraph.text)
return '\n'.join(TextList)
fileName = r'test.docx'
print(getText(fileName))
test.docx 内容如下:
Test数据
匹配数据
Test
Test 敏感信息
我在不同的电脑打印每一行长度有些不同,不清楚是否跟word版本以及word
版本内置的字体有关。而且只支持docx,暂不支持doc。
打印结果如下:
打印文件行数:7
打印第1行: Test 数据
打印第1行长度: 2
打印第3行长度: 1
打印第5行长度: 1
打印第7行长度: 3
Test
数据
----------
T
est
敏感信息
----------
Test数据
匹配数据
Test
Test 敏感信息
而在专业版word上执行结果是 :
打印第1行长度: 2
打印第3行长度: 1
打印第5行长度: 2
打印第7行长度: 4
细节问题暂没时间深究,猜测和系统默认字体有关,理由是在pycharm打开docx文档默认字体不同,一个是英文字体,一个是等线字体。
0x03 reference
【数据安全】一文读懂数据内容识别核心技术 – 绿盟科技技术博客
了解基于确切数据匹配的敏感信息类型 | Microsoft Learn -- 微软EDM敏感信息识别
python使用docx模块读写docx文件的方法与docx模块常用方法_docx.document_癫疯时刻的博客-CSDN博客
用Python读写Word文档入门-腾讯云开发者社区-腾讯云
python解析并读取PDF文件:函数总结_pypdf读取章节内容_满腹的小不甘的博客-CSDN博客
0x04 后记
python 识别pdf 中敏感信息见 reference 里的链接。python 识别pdf 推荐 pdfminer3k 或 pdfplumber 两个库。
由于时间关系本文写的略简洁,,敏感图片识别也没有介绍到,后续如果有时间会继续修改完善本文。