openDLP

openDLP(open data loss prevention)是一个敏感数据识别工具,支持对结构化数据表进行敏感数据识别,可以帮助企业进行数据资产分类分级,保护数据安全。

openDLP根据不同的敏感数据的特点,采用正则表达式、人工智能算法等不同方法进行敏感数据识别,内置支持了多种敏感数据类型,同时支持自定义敏感数据类型识别。

openDLP的正则表达式生成功能能够基于提供的正、负训练样本数据,自动学习生成正则表达式。

特性

  • 表格数据敏感数据识别:

    • 目前支持身份证号、人名等17中常见敏感数据类型识别。详见”支持的敏感数据类型“部分。

    • 对于不在内置类型中的类别,支持用户传入正则表达式,对自定义敏感数据类型进行识别;

    • 采用神经网络分类模型、实体识别、正则表达式、数据校验规则等技术进行敏感数据识别。

  • 正则表达式生成:

    • 基于正、负样本数据,自动学习生成正则表达式;

    • 考虑了样本数据串中的频繁子字符串,能够捕获到数据中的细节特征。

安装

可通过如下命令进行安装:

pip install opendlp

快速开始

表格敏感数据识别

下载资源文件(可选)

本项目中的命名实体识别使用了HanLP开源项目中的模型,使用前需先下载相关模型文件并解压到指定目录,如未手动下载,第一次运行时会自动下载。

内置敏感数据类型识别

from opendlp.sensitive_analyze import table_analyzer
# openDLP github项目中的数据,根据实际情况修改路径
csv_table_path = 'openDLP/tests/data/dataset-test.csv'   
result = table_analyzer.analyze(csv_table_path)
print(result)

输出如下:

{'PERSON': {'success': True, 'type': 'PERSON', 'fraction': '969/1000'},
 'ID_CARD': {'success': True, 'type': 'ID_CARD', 'fraction': '1000/1000'},
 'TELEPHONE': {'success': True, 'type': 'TELEPHONE', 'fraction': '1000/1000'},
 'MOBILE_PHONE': {'success': True,
  'type': 'MOBILE_PHONE',
  'fraction': '1000/1000'},
 'EMAIL': {'success': True, 'type': 'EMAIL', 'fraction': '971/1000'},
 'LICENSE_PLATE': {'success': True,
  'type': 'LICENSE_PLATE',
  'fraction': '1000/1000'},
 'BANK_CARD': {'success': True, 'type': 'BANK_CARD', 'fraction': '1000/1000'},
 'PASSPORT': {'success': True, 'type': 'PASSPORT', 'fraction': '1000/1000'},
 'COMPANY_NAME': {'success': True,
  'type': 'COMPANY_NAME',
  'fraction': '789/1000'},
 'SOCIAL_CREDIT_CODE': {'success': True,
  'type': 'SOCIAL_CREDIT_CODE',
  'fraction': '1000/1000'},
 'IPV4': {'success': True, 'type': 'IPV4', 'fraction': '1000/1000'},
 'IPV6': {'success': True, 'type': 'IPV6', 'fraction': '1000/1000'},
 'MAC': {'success': True, 'type': 'MAC', 'fraction': '1000/1000'},
 'DOMAIN_NAME': {'success': True,
  'type': 'DOMAIN_NAME',
  'fraction': '965/1000'},
 'LOCATION': {'success': True, 'type': 'LOCATION', 'fraction': '997/1000'},
 'POSTCODE': {'success': True, 'type': 'POSTCODE', 'fraction': '993/1000'},
 'DATE': {'success': True, 'type': 'DATE', 'fraction': '1000/1000'}}

用户自定义敏感数据类型识别

csv_table_path = 'openDLP/tests/data/data-udf.csv'
regex_pattern_file = 'openDLP/tests/data/pattern.json'
threshold = {'QQ':1}

result = table_analyzer.analyze(csv_table_path, regex_pattern_file, threshold)

输出如下:

{'QQ': {'success': True, 'type': 'OTHER', 'fraction': '9/10'},
 'PASSWORD': {'success': True, 'type': 'PASSWORD', 'fraction': '10/10'}}

“QQ”为数据表中的列名,“success”标识该列是否识别成功,“type”为识别成的敏感数据类型,OTHER表示不是敏感数据类型,“fraction”为该列中识别比例最高的类型的占比,这里的”9/10”的含义是该列有10个元素,有9个识别为了QQ,但QQ的判断阈值设置的是1,大于0.9,所以其类型被判断为了OTHER。

正则表达式生成

from opendlp.regex_generation import generator
regex_name = 'id_card'
train_data_file = '../openDLP/tests/data/regex_generation/test-data/ID_CARD.csv'

result = generator.generate(regex_name, train_data_file, init_population_size=500, max_iterations=100)

会输出类似下面这样的信息:

id_card: \d{6,6}19\d{9,9}\w|\d{6,6}20\d{9,9}\w

支持的敏感数据类型

目前内置支持17类敏感数据类型,可以通过自定义正则支持更多类型的识别。对于有地区和语言差异的类型,目前都是支持中国大陆地区、简体中文。具体敏感数据类型如下:

  1. 人名

  2. 身份证号

  3. 护照号

  4. 银行卡号

  5. 车牌号

  6. 电子邮箱

  7. 邮政编码

  8. 移动手机号码

  9. 固定电话号码

  10. 地址

  11. 公司名

  12. 统一社会信用代码

  13. 日期

  14. 域名

  15. IPv4地址

  16. IPv6地址

  17. MAC地址