惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
D
Docker
有赞技术团队
有赞技术团队
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
爱范儿
爱范儿
H
Help Net Security
美团技术团队
MyScale Blog
MyScale Blog
B
Blog RSS Feed
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
A
About on SuperTechFans
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
G
Google Developers Blog
月光博客
月光博客
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
F
Fortinet All Blogs

任霏博客

我将关闭服务器:AI彻底掐死了奄奄一息的个人博客 - 博客文章 - 任霏的个人博客网站 Vibe Coding 实现本地模型 Token 自由 IntelliJ IDEA + LM Studio + LM Link + Continue - 博客文章 - 任霏的个人博客网站 1Password涨价后,别急着退订1Password,这个操作能帮你省25% - 博客文章 - 任霏的个人博客网站 我,吃饱了撑的注册了个域名,Cloudflare账号没了,不建议将域名放在Cloudflare - 博客文章 - 任霏的个人博客网站 临时邮箱:保护隐私与免骚扰的新方式 - 博客文章 - 任霏的个人博客网站 价值4100万美元SOL被盗SwissBorg在Solana上遭遇安全事件超200万枚ETH排队退出质押 - 博客文章 - 任霏的个人博客网站 注意 Web3 钱包遭遇 NPM 超大规模供应链攻击投毒事件 - 博客文章 - 任霏的个人博客网站 我受到以太坊ERC-20假代币地址投毒攻击记录一下大家谨防上当受骗 - 博客文章 - 任霏的个人博客网站 在2025年使用显卡 NVIDIA RTX 2080 Ti 挖矿收益记录和分析还能不能挖矿 - 博客文章 - 任霏的个人博客网站 分享我是如何成功戒烟的经验(包含失败的经验) - 博客文章 - 任霏的个人博客网站 在 OpenWRT 中配置 PassWall2 插件的教程记录 - 博客文章 - 任霏的个人博客网站 Office Professional Plus 2019 VL 版下载与 KMS 激活 - 博客文章 - 任霏的个人博客网站 最近几天我的 CDN 流量受到来自电信[山东烟台]、[江苏扬州]两地家庭宽带的攻击 - 博客文章 - 任霏的个人博客网站 自建AI服务器使用PVE配置显卡直通虚拟机安装驱动、CUDA和cuDNN运行LLM大模型进行AI炼丹 - 博客文章 - 任霏的个人博客网站 各代英特尔Intel芯片组主板适配兼容的CPU和DDR内存数据统计 - 博客文章 - 任霏的个人博客网站 GitLab Global 国际站将在60天内删除中国大陆、香港、澳门地区的账号 - 博客文章 - 任霏的个人博客网站 Github Copilot Free 开放免费版所有人均可使用 OpenAI GPT-4o、Anthropic Claude 3.5 AI 代码生成服务 - 博客文章 - 任霏的个人博客网站 Cloudflare 更新了订阅协议明确禁止优选IP和搭建梯子的行为 - 博客文章 - 任霏的个人博客网站 Linux(systemd)手动离线安装二进制(binary)MairaDB数据库指定版本 - 博客文章 - 任霏的个人博客网站 流程引擎 Flowable/Activiti 无法启动报错:liquibase - Waiting for changelog lock.... - 博客文章 - 任霏的个人博客网站 Spring Boot 全局异常捕获 ControllerAdvice 无法捕获 过滤器(Filter)和拦截器(Interceptor)中的异常 - 博客文章 - 任霏的个人博客网站 Freenom 收回了全部免费域名(.tk/.cf/.gq/.ga/.ml) - 博客文章 - 任霏的个人博客网站 Alibaba Druid 数据库连接池 takeLast() AQS 死锁导致程序无响应 - 博客文章 - 任霏的个人博客网站 你的网站加入 HSTS preload 预加载列表了吗 - 博客文章 - 任霏的个人博客网站 我的博客网站接入使用 Cloudflare 的架构分享 - 博客文章 - 任霏的个人博客网站 在 Ubuntu 上的 Nginx 高并发配置实践 - 博客文章 - 任霏的个人博客网站 技术分析黑客敲诈勒索站长的新手法百度对此也无能为力 - 博客文章 - 任霏的个人博客网站 百度站长平台快速收录权限和sitemap提交权限被全部收回 - 博客文章 - 任霏的个人博客网站 极狐 GitLab 免费时代结束不升级付费账号将禁止登陆 - 博客文章 - 任霏的个人博客网站 免费.ml域名10年委托合同到期被马里共和国收回域名经营权 - 博客文章 - 任霏的个人博客网站
火车票上身份证脱敏的漏洞可以暴露你的身份证号 - 博客文章 -...
任霏 · 2020-02-28 · via 任霏博客

火车票大家都非常熟悉了,都做过火车,现在都是实名制购票,火车票上有你的身份证号和姓名等实名信息,其中身份证号被星号隐藏了四位,你以为就可以安全的丢弃吗?作为程序员的我想告诉你,其实通过程序可以很快的计算出你可能的身份证号码。

身份证号的构成

首先,我们需要了解身份证号是如何构成的。左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。六位地址码表明你是哪个省哪个市哪个区县的人,然后是生日,三个顺序码可以认为随机数,最后一位是校验位。校验位可以对前面的信息进行算法计算以后得出一个校验数字。

校验算法

根据前17位计算最后一位校验位的Java代码逻辑:

package net.renfei.util;

public class IDNumberUtil {
    private int[] weight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};           //十七位数字本体码权重
    private char[] validate = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};      //mod11,对应校验码字符值
    public char getValidateCode(String id17) {
        int sum = 0;
        int mode = 0;
        for (int i = 0; i < id17.length(); i++) {
            sum = sum + Integer.parseInt(String.valueOf(id17.charAt(i))) * weight[i];
        }
        mode = sum % 11;
        return validate[mode];
    }
}

穷举脱敏部分

火车票

火车票上被脱敏的四位数是月份和日期,那么一年中大约有365天,就是365种可能性,我们先全部穷举出365种可能的前17位身份证号码,也就是从 0101到1231 的日期,通过程序很容易就可以遍历,然后计算最后一位校验位,如果满足就标记为疑似的身份证号,以上图”刘大明“的火车票为例,我的代码是:

package net.renfei.util;

import lombok.extern.slf4j.Slf4j;
import net.renfei.TestApplication;
import org.junit.Test;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

@Slf4j
public class IDNumberUtilTest extends TestApplication {
    @Test
    public void idNumberTest() throws ParseException {
        String idPre = "6221261980", idPost = "314", idCheck = "4";
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date birthDate = dateFormat.parse("1980-01-01");
        List<String> allID = new ArrayList<>();
        for (; ; ) {
            Calendar c = Calendar.getInstance();
            c.setTime(birthDate);
            c.add(Calendar.DAY_OF_MONTH, 1);// 今天+1天
            birthDate = c.getTime();
            if (c.get(Calendar.YEAR) == 1981) {
                break;
            }
            int month = c.get(Calendar.MONTH)+1;
            int day = c.get(Calendar.DAY_OF_MONTH);
            allID.add(idPre + (month < 10 ? "0" + month : month) + (day < 10 ? "0" + day : day) + idPost);
        }
        IDNumberUtil idNumberUtil = new IDNumberUtil();
        List<String> suspectedID = new ArrayList<>();
        for (String id : allID
        ) {
            log.info("== 检查:{}", id + idCheck);
            if (idCheck.equals(idNumberUtil.getValidateCode(id) + "")) {
                suspectedID.add(id + idCheck);
            }
        }
        for (String id : suspectedID
        ) {
            log.info("== 发现疑似ID:{}", id);
        }
    }
}

执行的结果是发现34个疑似身份证:

  • == 发现疑似ID:622126198001023144
  • == 发现疑似ID:622126198001103144
  • == 发现疑似ID:622126198001293144
  • == 发现疑似ID:622126198002093144
  • == 发现疑似ID:622126198002173144
  • == 发现疑似ID:622126198002253144
  • == 发现疑似ID:622126198003053144
  • == 发现疑似ID:622126198003133144
  • == 发现疑似ID:622126198003213144
  • == 发现疑似ID:622126198004013144
  • == 发现疑似ID:622126198004283144
  • == 发现疑似ID:622126198005083144
  • == 发现疑似ID:622126198005163144
  • == 发现疑似ID:622126198005243144
  • == 发现疑似ID:622126198006043144
  • == 发现疑似ID:622126198006123144
  • == 发现疑似ID:622126198006203144
  • == 发现疑似ID:622126198007193144
  • == 发现疑似ID:622126198007273144
  • == 发现疑似ID:622126198008073144
  • == 发现疑似ID:622126198008153144
  • == 发现疑似ID:622126198008233144
  • == 发现疑似ID:622126198008313144
  • == 发现疑似ID:622126198009033144
  • == 发现疑似ID:622126198009113144
  • == 发现疑似ID:622126198010093144
  • == 发现疑似ID:622126198010173144
  • == 发现疑似ID:622126198010253144
  • == 发现疑似ID:622126198011053144
  • == 发现疑似ID:622126198011133144
  • == 发现疑似ID:622126198011213144
  • == 发现疑似ID:622126198012013144
  • == 发现疑似ID:622126198012283144

验证身份证号和姓名

我们计算出疑似的身份证号以后,还是无法确定哪一个对应”刘大明“的身份证号,这时候12306网站还有个漏洞可以利用,那就是添加常用联系人功能,我们把身份证号和姓名都尝试一遍,很快就可以找到正确的身份证号和姓名的组合。

12306