[安全开发]日志敏感信息检测-1-身份证

2023-11-09

  1. 前言
  2. 身份证号码格式
  3. 正则提取
  4. 地址码校验
  5. 校验码校验
  6. 优化思考

前言

防止敏感信息泄漏,保护用户和企业信息隐私,是企业安全中重要的环节。

通过检测日志中的敏感信息,能够:

  1. 排查潜在的泄漏敏感信息的系统和接口,防止被黑产恶意利用,盗取用户敏感信息
  2. 检查数据传输、日志打印的规范,是否对敏感信息有做加密、脱敏等处理

对于海量日志的敏感信息检测,可以采用Flink流数据处理引擎,进行检测排查。

本文不讨论Flink,只记录日志中身份证号码检测规则的一点心得。

身份证号码格式

一代身份证基本不存在了,无需做检测,一起来看看二代身份证的格式。

二代身份证号码共18位,由17位本体码和1位校验码组成:

  • 前6位:地址码,表示登记户口时所在地的行政区划代码
  • 7到14位:出生年月日,采用YYYYMMDD格式
  • 15到17位:顺序码,同一地区,同一年月日出生的人的顺序编号,男生奇数,女生偶数
  • 第18位:校验码,由前17位本体码计算得到

补充说明一下,二代身份证与一代身份证的区别:

  • 位数:一代身15位,二代18位
  • 出生日期:一代为YYMMDD格式,二代为YYYYMMDD格式
  • 校验码:一代无校验码,二代有校验码

正则提取

首先通过正则,进行简单的筛选,从日志中提取疑似身份证号码的数字。

\W\d{6}(19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]\W

正则说明

  • \W:匹配非单词字符,与"[^A-Za-z0-9_]"等效
  • \d{6}:匹配前6位地址码
  • (19|20)\d{2}:匹配年份
  • ((0[1-9])|(10|11|12)):匹配月份
  • ((\[0-2][1-9])|10|20|30|31):匹配日期
  • \d{3}:匹配顺序码
  • [0-9Xx]:匹配校验码

从生产实践的经验来看,日志中大部分变量值,都被符号所包围,例如:

  • example?name=shadow&phone=12345678910&……
  • “id_card”:“110101199003071938”,“age”:“18”……

而未被符号所包围的变量,绝大部分可能都是误报,例如:

  • deptNo=17261101011990030719384324

所以,初期做日志的敏感信息检测时,可以从这些特殊符号入手,用正则\W去做匹配,这样能提高不少准确率。后期敏感信息都被揪出来之后,再去掉\W,去进行更大范围、更进一步的检测排查。

在上面的正则表达式里,我们对身份证年月日的部分做了简单校验,但我们不能据此就判定,检测出的是身份证号码,因为在海量日志里,正则会匹配到各种巧合的误报。而依靠人工去筛查这些误报,确认风险,是很费时费力的。我们要做的,就是继续要提高身份证号检测的准确率,所以接下来,我们进一步对身份证号的地址码和校验码进行校验。

地址码校验

身份证的前6位地址码是固定的,我们可以取这前6位数字,与地址码库进行匹配,若匹配成功,则进行下一步,校验码的校验。
地址码库搬运:身份证号码前6位地址码
地址码样例

校验码校验

前面说了,身份证最后一位是校验码,由前17位本体码计算得到,具体的计算算法这里不深究,感兴趣的读者,可以参考这篇博客:身份证号码的编码规则及校验
这里我们直接给出,身份证号码校验码的校验算法的Java代码实现:

/**
 *
 * 18位的二代身份证号码校验码校验
 * @param idCardNo 身份证号码
 * @return true - 校验通过
 *         false - 校验不通过
 */
private static boolean idCardNoCheck(String idCardNo) {
    // 加权因子
    int[] w = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
    char[] idCardNoArray = idCardNo.toCharArray();
    int sum = 0;
    for (int i = 0; i < w.length; i++) {
        sum += Integer.parseInt(String.valueOf(idCardNoArray[i])) * w[i];
    }
    // 校验位是X,则表示10
    if (idCardNoArray[17] == 'X' || idCardNoArray[17] == 'x') {
        sum += 10;
    } else {
        sum += Integer.parseInt(String.valueOf(idCardNoArray[17]));
    }
    // 如果除11模1,则校验通过
    return sum % 11 == 1;
}

优化思考

通过上面的 正则提取+地址码校验+校验码校验 三部曲,从日志中检测出的数字,基本99%是身份证号码,准确率极高。但在海量日志的检测过程中,各种奇葩数据都有,还是会存在1%的误报的。

对于这1%的误报,有两个处理思路:

  1. 误报为偶然出现,且只出现过一两次,也没有其他类似特征的误报,则直接忽略即可
  2. 误报具有一定的特征,且多次出现,为同一类误报,则可以提取特征,针对性的制定白名单过滤。白名单推荐采用正则匹配进行过滤
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[安全开发]日志敏感信息检测-1-身份证 的相关文章

  • VMware安装RHEL 8.2(红帽)

    一 创建虚拟机 打开VMware 点击 创建新的虚拟机 点击自定义 下一步 选择兼容性 15 x 兼容性选VMware的版本 稍后安装操作系统 选择镜像对应的操作系统类型及版本 系统镜像按自己准备的选择即可 自定义虚拟机名称及安装的位置 名
  • 数组的方法以及特征

    数组变成一个字符串 1 join 可以在每一个元素中加一个字符串 2 toString pop 删除数组最后一个元素 push 增加数组 reverse 反转 slice 从下标开始取 sort 对数组进行排序 splice 删除数组的某几
  • 取消全部呼叫转移代码_中国移动的卡取消呼叫转移的快捷方式是什么?

    展开全部 取消已设置的所有呼转可用手机拨打 002 取62616964757a686964616fe59b9ee7ad9431333365663562消关机或无信号时转移可用手机拨打 62 取消无人接听时转移可用手机拨打 61 取消遇忙音占
  • 即时通讯(IM)开源项目OpenIM对WebAssembly支持,提升web端体验

    WebAssembly 是什么 2019 年 12 月 W3C 标准批准了第四种官方语言 WebAssembly Wasm 这种语言在结构 使用和功能方面与以前的语言有很大不同 WebAssembly 是一种新的编码方式 可以在现代的Web
  • [1138]java中json的使用和解析

    文章目录 1 创建json对象 1 1 创建JSONObject对象 1 2 创建JSONArray对象 2 解析json 2 1 官方json包解析 2 2 fastjson解析 2 3 jackson解析 1 创建json对象 1 1
  • 关于时区的时间的详解,比如UTC\GMT等

    来源 UTC 和 GMT 及 北京时间的关系 UTC和GMT 这两者几乎是同一概念 它们都是指的格林尼治标准时间 只不过UTC的称呼更为正式一点 两者的区别在于前者是一个天文 上的概念 而 后者是基于一个原子钟 在UTC中 每一年或两年会有
  • 移植micropython最小工程到mm32f3270微控制器

    移植micropython最小工程到mm32f3270微控制器 苏勇 2021 08 文章目录 移植micropython最小工程到mm32f3270微控制器 Introduction 初试micropython v1 6 增加MM32的移
  • OpenCV图像梯度(Sobel和Scharr)

    OpenCV图像梯度 Sobel和Scharr 1 图像梯度是什么 2 图像梯度的用途 3 图像梯度的使用 参考 这篇博客将介绍图像渐变以及如何使用OpenCV的cv2 Sobel计算Sobel渐变和Scharr渐变 1 图像梯度是什么 图
  • CMake - 使用 target_sources() 提高源文件处理能力

    翻译自https crascit com 2016 01 31 enhanced source file handling with target sources 使用 target sources 提高源文件处理能力 在CMake项目中
  • JDK8源码阅读(三) java.io.Serializable

    一 类 1 1 类修饰符 A 是一个接口 B 类的可序列化性由实现java io serializable接口的类启用 不实现此接口的类将不具有序列化或反序列化的任何状态 可序列化类的所有子类型本身都是可序列化的 序列化接口没有方法或字段
  • 数据结构——单链表OJ题

    单链表OJ题 前言 一 删除链表中等于给定值 val 的所有节点 二 反转一个单链表 三 返回链表的中间结点 四 输出该链表中倒数第k个结点 五 将两个有序链表合并 六 链表的回文结构 七 将链表分割成两部分 八 找出第一个公共结点 九 判
  • Matlab:交叉验证,索引结果重现,打乱数据

    总会有奇奇怪怪的想法和需求 想要产生的交叉验证的索引可以重现 虽然可以采取保存的方式 目录 一 随机选取 1 产生索引 2 调用数据 打乱数据 二 顺序选择 循环选取 1 数据初始化 样本个数 训练样本个数等 2 产生训练数据的索引 3 存
  • 多线程编程warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 错误解决

    在多线程编程中使用 thread start pthread t thread id THREAD BODY thread workbody void thread arg 创建子线程时因为最后一个参数需要是指向子线程的文件描述符 int类

随机推荐

  • 使用axis2 java2wsdl命令生成wsdl文件

    1 eclipse新建web工程 编写service接口方法 2 axis2环境变量配置 必须配置环境变量 否则执行java2wsdl命令时无法识别路径 如下 新建环境变量 AXIS2 HOME 值为axis2解压路径如 I path ja
  • vim常用配置及ideavim插件静音

    更多详细内容见文章 http www shanxing top p 188http www shanxing top p 188 提示音静音 set noerrorbells set visualbell 语法高亮 syntax enabl
  • Linux USB U盘热插拔挂载和卸载

    一 硬件平台 1 控制器 MT7620 A9内核 2 RTC芯片 MCP7940 二 软件平台 1 开发环境 Ubuntu12 04 2 SDK内核包 MT7620 SDK软件开发包 MediaTek ApSoC SDK 4320 2015
  • Ubuntu 18.04 VScode 使用php-debug插件

    1 安装xdebug 安装 php dev apt get install php7 X dev autoconf automake 复制代码 上面的7 X请改成对应的php版本号 不然默认会下载php最新的版本 使用对应的 xdebug
  • python运算符

    算术运算符 以下假设变量 a 10 b 20 加 两个对象相加 a b 输出结果 30 减 得到负数或是一个数减去另一个数 a b 输出结果 10 乘 两个数相乘或是返回一个被重复若干次的字符串 a b 输出结果 200 除 x除以y b
  • python matplotlib数据可视化案例-生成柱状图,饼图(扇形图),词云。

    目前python spark scala十分火爆 于是我就利用爬虫将猎聘上的招聘信息进行了一下获取 相比起来 猎聘上的职位数量还是很多的 3中技术类型以 python spark scala 作为关键词 一共爬取了一万多条信息 爬取的主要信
  • 【告别普通打包】webpack打包结果优化特性:Tree Sharking 和 sideEffects

    文章目录 1 Tree Shaking 摇树 1 1 摇树讲解 1 2 开启 Tree Shaking 1 3 合并模块 扩展 1 4 探讨 babel loader 的问题 2 sideEffects 2 1 sideEffects讲解
  • kotlin语法总结(二)

    上一章地址 kotlin语法总结 一 文章目录 前言 前言 这章接着上一章语法总结继续讲解 主要讲kotlin和java不一样的地方 40 嵌套类 41 数据类 data class 提供toString equals hashCode个性
  • qemu创建linux虚拟机(亲测有效,virt-manger方式)

    1 网桥的搭建 Bridge方式原理 Bridge方式即虚拟网桥的网络连接方式 是客户机和子网里面的机器能够互相通信 可以使虚拟机成为网络中具有独立IP的主机 桥接网络 也叫物理设备共享 被用作把一个物理设备复制到一台虚拟机 网桥多用作高级
  • linux下一个简单的TCP通信程序——客户端向服务端发送任意字符串

    程序目的 服务器端等待客户端连接 若连接成功 则用户可以通过服务器在接受到字符串后进行判断 若不是quit字符串则输出客服端的地址信息 以及接受到的数据 同时将接受到的数据按照原样再发给客服端 若是quit字符串则断开本次连接 问题以及解决
  • 代码点和代码单元

    codePoint和codeUnit 背景 在设计Java时决定采用16位的Unicode字符集 然而16位的Char类型已经不能满足描述所有Unicode字符的需要了 为了解决这个问题 故使用代码点和代码单元 区别 代码点 Code Po
  • C++数据结构X篇_06_C++单向循环链表实现

    本篇参考C 单向循环链表实现整理 先搞懂结构框架 后期根据视频利用c对内容实现 也可以对c有更高的提升 文章目录 1 链表定义 2 链表插入 3 链表打印 注意打印过程是跳过头节点head的 4 实验 单向循环链表与单向链表十分相似 具有关
  • Java 子类继承父类方法的重写(或者覆盖,override)

    1 子类重写父类方法的方法名 参数类型必须与父类被重写 被覆盖 的方法相同 2 子类方法的返回值类型必须小于等于父类被重写的方法的返回值类型 3 子类抛出的异常小于等于父类方法抛出的异常 4 子类的访问权限大于等于父类的访问权限 子类重写了
  • 文心千帆大模型测评分享,效果超出预期

    一 前言 现如今 随着ChatGPT的爆火越来越多的人开始关注人工智能领域了 大家都在尝试使用它来帮助自己在工作上提高效率亦或是解决一些问题 但ChatGPT是有一定的使用门槛的 首先需要我们 科学上网 才能访问 其次GPT4的价格相对来说
  • 2.关于剪枝算法的分类和论文整理

    第二篇 关于剪枝算法的分类 1 非结构化剪枝 1 1 非结构化的weights剪枝 2 结构化剪枝 2 1 Filter Channel Pruning 2 2 Neuron wise pruning 2 3 Group wise Prun
  • Ag-grid属性整理

    import ClickableStatusBarComponent from component clickableStatusBarComponent import HaearCustomComponent from component
  • 数字图像处理之二维码图像提取算法(十)

    这里来说明一下做这次的二维码提取算法用到的函数 最后再给出完整的代码 进行图像的二值化 这里可以使用opencv2里的函数threshold 当然在opencv里也有cvThreshold函数 这个函数可以具体参考 http blog cs
  • 电影院里一个男孩对他女友所做的全过程

    电影院里一个男孩对他女友所做的全过程 周末上电影院看电影 热得不行 提前入场好凉快凉快 坐定 见一对青年男女挽手走了进来 男孩大概二十三四岁模样 肩上挎着他女友的背包 手里拿着一包零食还有可乐 男孩轻声征询女孩究竟坐哪儿合适 女孩没说话 努
  • Hibernate 一对多 多对一 实例 及一些 问题(1)插入及查询

    Clazz java package com wonders task sample bo import java util Set import javax persistence CascadeType import javax per
  • [安全开发]日志敏感信息检测-1-身份证

    前言 身份证号码格式 正则提取 地址码校验 校验码校验 优化思考 前言 防止敏感信息泄漏 保护用户和企业信息隐私 是企业安全中重要的环节 通过检测日志中的敏感信息 能够 排查潜在的泄漏敏感信息的系统和接口 防止被黑产恶意利用 盗取用户敏感信