火车票上身份证脱敏的漏洞可以暴露你的身份证号
2020年02月27日 19:40:01 · 本文共 1,839 字阅读时间约 6分钟 · 4,658 次浏览火车票大家都非常熟悉了,都做过火车,现在都是实名制购票,火车票上有你的身份证号和姓名等实名信息,其中身份证号被星号隐藏了四位,你以为就可以安全的丢弃吗?作为程序员的我想告诉你,其实通过程序可以很快的计算出你可能的身份证号码。
身份证号的构成
首先,我们需要了解身份证号是如何构成的。左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。六位地址码表明你是哪个省哪个市哪个区县的人,然后是生日,三个顺序码可以认为随机数,最后一位是校验位。校验位可以对前面的信息进行算法计算以后得出一个校验数字。
校验算法
根据前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网站还有个漏洞可以利用,那就是添加常用联系人功能,我们把身份证号和姓名都尝试一遍,很快就可以找到正确的身份证号和姓名的组合。
商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.renfei.net/posts/1003328
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.renfei.net/posts/1003328
相关推荐
猜你还喜欢这些内容,不妨试试阅读一下
热评文章
- 前后端分离项目接口数据加密的秘钥交换逻辑(RSA、AES)
- OmniGraffle 激活/破解 密钥/密匙/Key/License
- Redis 未授权访问漏洞分析 cleanfda 脚本复现漏洞挖矿
- CleanMyMac X 破解版 [TNT] 4.6.0
- OmniPlan 激活/破解 密钥/密匙/Key/License
- 人大金仓 KingbaseES V8 R3 安装包、驱动包和 License 下载地址
- Parallels Desktop For Mac 16.0.1.48911 破解版 [TNT]
- Parallels Desktop For Mac 15.1.4.47270 破解版 [TNT]
- Sound Control 破解版 2.4.2
- 向谷歌搜索引擎主动推送网页的教程 Google Indexing API 接口实现
热文排行
- 博客完全迁移上阿里云,我所使用的阿里云架构
- 微软确认Windows 10存在bug 部分电脑升级后被冻结
- 大佬们在说的AQS,到底啥是个AQS(AbstractQueuedSynchronizer)同步队列
- 比特币(BTC)钱包客户端区块链数据同步慢,区块链数据离线下载
- Java中说的CAS(compare and swap)是个啥
- 小心免费主题!那些WordPress主题后门,一招拥有管理员权限
- 强烈谴责[wamae.win]恶意反向代理我站并篡改我站网页
- 讨论下Java中的volatile和JMM(Java Memory Model)Java内存模型
- 新版个人网站 NEILREN4J 上线并开源程序源码
- 我站近期遭受到恶意不友好访问攻击公告