【溯源进阶】基于Python的身份证后四/六/八位爆破 + 实名二要素验证组合拳

【溯源进阶】基于Python的身份证后四/六/八位爆破 + 实名二要素验证组合拳-FancyPig's blog
【溯源进阶】基于Python的身份证后四/六/八位爆破 + 实名二要素验证组合拳
此内容为付费阅读,请付费后查看
18.88
一经购买概不退款
代码提供技术支持
付费阅读
已售 8

本文声明

此文仅用于技术科普,教育与研究用途,请勿用于商业甚至非法用途,否则一切后果自负。若用户利用此文章而受到惩处,本人及本平台对其行为概不负责,亦不承担任何连带责任。

免责声明

相关阅读

身份证校验码筛选正确的身份证-FancyPig's blog
实名二要素介绍及一次简单的实践 附PHP源码-FancyPig's blog

前言

社区里面有热心网友分享了相关内容,但写的并不是特别完整,这篇文章,就是在这上面的基础上刑上加刑!
身份证校验码筛选正确的身份证-FancyPig's blog

实战分享

身份证号是的编排是有一定规律可循的。除了最后1位是校验位外,其余各位与出生地出生日期性别出生编号息息相关,因此即使是经脱敏处理的身份证号,仍能通过程序分析的方式过滤出可能的身份证序列组合。 具体参考
身份证校验码筛选正确的身份证-FancyPig's blog
那么,我们是不是可以写一个支持对身份证后4、6位及身份证内生日的爆破的脱敏身份证恢复工具呢? 以下脚本根据GitHub项目中的脚本修改:

sfzBruter.py

原版(仅供参考,实战中不用):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2021-05-08
# @Author  : aplyc1a
# @FileName: info-sfz.py
import time

def brute_8(s):
    sfz=[]
    birthh=[]
    for i in range(int(time.mktime(time.strptime(s[6:10]+'0101','%Y%m%d'))),int(time.mktime(time.strptime(s[6:10]+'1231','%Y%m%d')))+1,3600*24):
        brute_4(s.replace('****',time.strftime('%Y%m%d',time.localtime(i))[4:],1))

def brute_6(s):
    sfz=[]
    birthh=[]
    for i in range(int(time.mktime(time.strptime(s[6:10]+'0101','%Y%m%d'))),int(time.mktime(time.strptime(s[6:10]+'1231','%Y%m%d')))+1,3600*24):
        if s[10:12] == time.strftime('%Y%m%d',time.localtime(i))[4:6]:
            brute_4(s.replace('**',time.strftime('%Y%m%d',time.localtime(i))[6:8],1))


def brute_4(s):
    for i in num:
        sfz=s.replace('***',i,1)
        summ=0
        for j in range(len(weight)):
            summ+=weight[j]*int(sfz[j])
        check=summ%11
        a=sfz.replace('*',checker[check],-1)
        print(a)

def brute_m4(s):
    birthh=[]
    for i in range(int(time.mktime(time.strptime(s[6:10]+'0101','%Y%m%d'))),int(time.mktime(time.strptime(s[6:10]+'1231','%Y%m%d')))+1,3600*24):
        sfz=s.replace('****',time.strftime('%Y%m%d',time.localtime(i))[4:])
        summ=0
        for i in range(len(weight)):
            summ+=weight[i]*int(sfz[i])
        check=summ%11
        if checker[check]==sfz[-1]:
            print(sfz)

if __name__=='__main__':
    s="5132211949****5126"
    weight=[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    checker=['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    num=[str(i).zfill(3) for i in range(1,1000)]
    
    #s="51322119491001****"
    if s.index('*')==14:
        brute_4(s)

    #s="513221194910******"
    if s.index('*')==12:
        brute_6(s)

    if s.index('*')==10:
        #s="5132211949********"
        if s.count('*')==8:
            brute_8(s)
        #s="5132211949****5126"
        if s.count('*')==4:
            brute_m4(s)
修改版: 以下需要自行修改: 第五十行是枚举区号开始的第一个区号 第五十一行枚举区号结束最后一个区号+1 第五十二行是你所知的生日加顺序码和校验码,最多支持八位未知 然后开始爆破,比如你所知一个人的生日是1982年6月26日,区号是430424(这里是方便枚举,身份证是网上泄露的) 所以五十、五十一、五十二行修改后:
a_1 = 430424 #区号开始 
a_2 = 430425 #区号结束+1 
s="19820626****" #举例:身份证号缺后四位
开始爆破吧! e6f47df987101328 桌面上会多一个sfz.txt,这就是字典了 然后就是我们的实名二要素验证了嘿嘿嘿……

最后的提醒

不过,这种接口也很容易被小人利用了!本篇文章仅作为技术科普,重点讲述技术原理。 希望大家以钻研技术为目的,接口也请合理使用,建议不要输入自己的(任何网站都有日志,你的输入都可能被记录) 同时,我们也希望大家不打扰、不侵犯他人隐私,借本篇文章,我们在发现这样的情况时,也希望大家保护好自己的隐私!
© 版权声明
THE END
喜欢就支持一下吧
点赞24 分享
评论 共176条

请登录后发表评论