
简介以Python暴力破解WiFi密码为主题的入门实战小项目面向刚接触Python语法、对网络安全攻防感兴趣的初学者。核心思路是提前准备一个存有常见八位数字密码的文本字典脚本逐行读取并尝试连接周边可搜索到的WiFi热点实现约1秒1次的连接测试可直观理解弱口令爆破的基本流程与脚本化操作方式。资源包共3个文件包含两个Python脚本——一个负责字典生成与读取另一个执行WiFi连接尝试——以及一个txt密码字典压缩包仅3KB结构精简便于二次修改学习。目前已有16360人学习资源虽小但能完整演示“字典循环尝试”的雏形适合作为Python网络编程与安全基础的练手实例。需要注意的是该程序只适用于极简单的八位数字口令请务必在自有或已获授权的网络环境中合法使用。开头聊到“python暴力破解wifi密码”这个话题我得先给大家提个醒这篇文章不是教你蹭网更不是鼓励你去破解邻居家的无线网络。我写这篇文章的初衷是很多做安全测试、物联网开发、或者纯粹想搞懂WiFi认证机制的朋友都在私下问我同一个问题——Python在这类密码测试里到底能做什么、又是怎么做的。我在帮公司做内部无线网络安全评估时确实会用到Python来搭建字典攻击的验证脚本今天就把这套完整的思路、工具链和踩坑记录整理出来供你在自己拥有或获得明确授权的设备上做安全测试时参考。这篇文章适合以下三类人一是刚入门网络安全、想搞明白WiFi握手包和字典攻击原理的学生二是做智能家居或路由器开发、需要验证设备密码强度的工程师三是对Python网络编程感兴趣、想看看Python在链路层能折腾出什么花样的爱好者。我会从协议原理讲到实际跑通的代码再到常见坑的排查争取让你看完就能搭起一套属于自己的无线安全验证环境。1. 先弄清“暴力破解WiFi”到底在破解什么1.1 WiFi密码不是“破”出来的是“套”出来的很多人一听到“暴力破解”脑海里就会浮现出电影里那种疯狂跑代码、进度条蹭蹭涨的画面。但现实中的WiFi密码测试本质上不是“破解”而是“验证”——验证一个预先准备好的密码字典里有没有哪个密码恰好和目标的密码一致。这里涉及到一个非常核心的协议概念WPA2/WPA3的认证过程。当你试图连接一个WPA2加密的WiFi时路由器和你的设备会进行一次“四次握手”4-Way Handshake。在这个握手过程中路由器不会直接告诉你密码是什么而是通过一种叫PBKDF2的密钥派生算法将密码和一个随机生成的SSID、以及一个每次连接都不同的随机数Nonce一起运算生成一个会话密钥。如果密码正确双方算出来的密钥就是一样的认证就通过。所以攻击者要做的并不是去“解密”密码而是提前把这次握手过程中的关键信息——尤其是路由器发送的随机数、自己的随机数、以及最终的认证消息——全部抓取下来。然后攻击者在本地用字典里的每一个候选密码重新走一遍同样的PBKDF2运算看看哪个密码能算出和抓包时一致的结果。一旦匹配密码就被“套”出来了。这个过程也叫做离线字典攻击和在线逐个试密码完全不同胜算大得多但也对字典质量要求极高。1.2 Python在这个链条里扮演什么角色明确了上面这个原理你就会发现Python在整个流程里其实有三层角色第一层抓包工具。Python本身很难直接操作无线网卡的监听模式所以抓包环节通常交给Aircrack-ng套件一个专业的无线安全审计工具集里的airodump-ng完成。第二层字典生成/处理引擎。这是Python的主场。你可以用Python编写脚本组合生日、手机号、常用口令变形规则生成几G甚至几十G的字典文件也可以对抓到的握手包进行批量预处理、筛选甚至清洗弱口令。第三层核心运算逻辑。虽然专业的破解计算通常交给hashcat这样的显卡加速工具但用Python写一个纯CPU版本用来理解PBKDF2、消息验证码MIC的校验流程是非常好的教学实践。这也是为什么很多网络安全教材在讲破解原理时都会给出一段Python参考代码。说白了真正决定成败的是字典和硬件但Python是你手里最灵活的“调度中枢”。2. 环境准备与核心工具链2.1 硬件与系统要求在做WiFi密码安全测试之前先确认你的硬件支不支持。这块是我见过翻车最多的地方。WiFi抓包不是拿手机或者普通笔记本无线网卡就能干的关键是你的网卡要支持监听模式Monitor Mode。监听模式下网卡不再简单地接收发往自己的数据帧而是会把覆盖范围内所有无线信道上的数据帧统统收下来。绝大多数笔记本自带的Intel无线网卡不支持这个功能原因倒不是硬件不行而是驱动层面被限制了。所以安全测试圈里大家基本都会备一块外接USB无线网卡。我自己的主力测试卡是Atheros AR9271芯片方案的淘宝上几十块钱Linux下免驱支持监听模式和包注入实测抓握手包非常稳定。其他常见的选择还有Ralink RT3070芯片方案的也便宜大碗不过在某些内核版本下驱动需要单独编译。Realtek RTL8812AU则是支持5G频段和802.11ac速度上限更高但驱动安装要踩不少坑新手不建议一上来就用它。购买外接网卡时一定问清楚芯片方案不要只看商品标题里写的“支持kali”字样那玩意儿基本都是营销话术。操作系统方面我强烈建议你用虚拟机安装一个Kali Linux或者物理机装Ubuntu都行。Kali的好处是自带Aircrack-ng全套工具省去了编译驱动的痛苦。如果你用的是Ubuntu则需要自己装几个包下面会提到。2.2 Python环境与依赖库安装前面说过Python主要负责字典生成和校验逻辑所以环境上不需要装太多东西。如果你还没有Python环境我建议直接装Python 3.10以上的版本。Windows上从官网下载安装包时务必勾选“Add Python to PATH”这个细节能省掉后面一卡车的报错。Linux用户则直接通过系统包管理器安装即可。需要特别说明的是在Kali基于Debian上我一般不用系统自带的Python而是用Miniconda建一个干净的环境避免和系统内的渗透测试工具抢依赖。这也是为什么很多人执行pip安装时报错的原因——系统Python的site-packages被各种工具改得乱七八糟。清理出干净环境后再来看我们的代码需要什么库pip install pycryptodome pip install h2说实话在纯Python的破解验证脚本里真正用到的密码学库就是pycryptodome提供PBKDF2、HMAC、AES等实现。有人可能会问scapy不是更常用吗确实scapy可以做底层数据包处理但在这个项目里作用不大因为我们抓到的握手包是.cap格式解析工作交给Aircrack-ng的aircrack-ng命令就能完成不需要自己在Python里写pcap解析器。3. 核心原理与代码实现3.1 握手包抓取从零到一的关键步骤先说明一下完整的WiFi入侵测试流程有严格的前提必须在你拥有所有权的无线网络、或者你获得了网络管理员明确的书面授权的环境中进行。以下内容仅用于教学实验。第一步把USB网卡插入电脑在Kali终端确认网卡被识别iwconfig如果输出里能看到类似wlan0的无线网卡名称并且下方支持模式列表里显示Monitor说明硬件基础已经具备。接下来把网卡切换到监听模式sudo airmon-ng start wlan0执行完这条命令后网卡名称通常会变成wlan0mon。这里有一个坑如果系统里有NetworkManager之类的网络管理服务在运行它会自动把你网卡拉回托管模式导致监听模式被切断。所以执行airmon-ng start之前最好先执行下面的命令停掉这些服务sudo airmon-ng check kill注意这个操作会让你网卡无法正常连接网络属于正常现象。第二步扫描附近的WiFi网络sudo airodump-ng wlan0mon屏幕上会滚动出大量信息BSSID路由器的MAC地址、CH信道、ENC加密方式、AUTH认证方式、PWR信号强度、以及SSID网络名称。先锁定你的实验目标记住它的BSSID和信道号。第三步针对目标网络开启定向监听并把报文保存到文件sudo airodump-ng -c 11 --bssid 00:11:22:33:44:55 -w cap wlan0mon这条命令的含义是固定在信道11上监听只抓指定BSSID的流量并把结果写入名为cap的文件最终会生成cap-01.cap这样的文件。第四步赶在没有客户端连接的时候手动触发一次握手。这是整个抓包过程中最需要耐心的环节。简单粗暴的方式是发送去认证攻击deauth把连在路由器上的合法客户端挤下线客户端会自动重新连接在重连期间路由器就会广播握手消息。不过这个操作会短暂中断他人网络只建议在完全可控的实验环境里使用sudo aireplay-ng -0 3 -a 00:11:22:33:44:55 wlan0mon注意这里要开一个新终端执行而airodump-ng那个窗口不要关。执行完后回到抓包窗口如果右上角出现WPA handshake: 00:11:22:33:44:55的提示就说明握手包已经抓到任务完成。如果没有出现可以再多发几次或者等有客户端主动连接时立刻抓取。3.2 Python字典生成器让你告别网上买字典网上流传的所谓“wifi密码字典包”质量参差不齐动辄几十个G跑起来费时费力里面还全是低效的冗余数据。我个人的建议是字典自己造。所谓的“暴力破解”真正的瓶颈不在GPU算力而在字典的命中率。你花几千块买显卡提升的只是每秒尝试次数但如果字典里根本没有正确密码跑多久都没有意义。所以花时间在字典生成上是性价比最高的事情。分享一个我平时做安全评估时用的字典生成脚本它基于“密码习惯学”构建——也就是绝大多数人设置WiFi密码时逃不开的那几种模式import itertools import os def load_keywords(): 基础关键词可以根据目标用户画像自行扩展 return [ admin, root, password, 123456, 12345678, 88888888, taobao, jingdong, 10086, 13800138000, woaini, iloveyou, abc123, qwerty, wifi, router ] def gen_variants(): 对关键词做常见变形 1. 大小写变化 2. 结尾追加两位数字 3. 首字母大写 4. 常见特殊符号 keywords load_keywords() suffixes [str(i).zfill(2) for i in range(100)] symbols [!, , #, $, *, ] variants set() for kw in keywords: variants.add(kw) variants.add(kw.upper()) variants.add(kw.capitalize()) for suf in suffixes: variants.add(kw suf) variants.add(kw.capitalize() suf) for sym in symbols: variants.add(kw sym) variants.add(kw sym 1) variants.add(kw.capitalize() sym 1) return variants def gen_date_combos(): 生成生日类组合1980-2024年四种格式 combos set() years range(1980, 2025) for y in years: combos.add(str(y)) combos.add(str(y) 01) combos.add(str(y) 0101) combos.add(str(y) 1231) return combos def gen_phone_prefixes(): 生成基于手机号前3位的弱密码组合仅演示前几位 prefixes [138, 139, 150, 151, 152, 158, 159, 180, 181, 188, 199] combos set() for p in prefixes: for i in range(10000000, 10000008): # 只演示少量实际可跑全量 combos.add(p str(i)[-8:]) return combos def main(): out_path wifi_dict.txt variants gen_variants() dates gen_date_combos() phones gen_phone_prefixes() all_passwords variants.union(dates).union(phones) with open(out_path, w) as f: for pwd in all_passwords: if 8 len(pwd) 15: f.write(pwd \n) print(f字典生成完成共 {len(all_passwords)} 条记录输出到 {out_path}) if __name__ __main__: main()你可能注意到了这个脚本只是提供了一个框架里面隐藏了很多可配置参数比如手机号前缀列表、后缀力度、最小和最大密码长度。实际使用时还需要结合目标的社会学信息做定向调整。比如做公司内部无线网络测试我会把公司简称、成立年份、办公楼门牌号、部门英文名加进去做家庭路由器测试则主要依赖姓名拼音、生日、手机尾号等维度。字典生成之后有个小技巧去重。几百万条数据的字典里重复项非常多跑一遍去重能减少两到三成的时间浪费sort -u wifi_dict.txt -o wifi_dict_uniq.txt3.3 Python校验器手写一次握手校验过程理解了前面讲的四次握手原理用Python实现握手包的校验就顺理成章了。作为教学演示我给出的是一个简化版的验证思路实际破解中我们更多还是直接调用aircrack-ng命令行但理解底层算法的确会让你在遇到问题时更游刃有余。握手包的关键信息有四个要素SSID、AP Nonce、Client Nonce、MIC。其中MIC是通过密码计算出来的校验值一共16字节是最后一步认证的凭证。用一句话概括校验过程从字典里取一个候选密码结合SSID生成PMK成对主密钥再用PMK和前面抓到的那几个随机数算出PTK成对临时密钥最后把PTK里拆出来的KEK密钥加密密钥去解密握手包里的加密数据如果能解出有效内容说明密码就是它。下面是核心代码逻辑from Crypto.Protocol.KDF import PBKDF2 from Crypto.Hash import HMAC, SHA1 def generate_pmk(passphrase, ssid): 根据WPA2标准PMK PBKDF2(passphrase, ssid, 4096, 32, HMAC-SHA1) 这个计算是破解中最耗CPU的部分。 passphrase_bytes passphrase.encode(utf-8) ssid_bytes ssid.encode(utf-8) pmk PBKDF2(passphrase_bytes, ssid_bytes, 32, count4096, hmac_hash_moduleSHA1) return pmk def generate_ptk(pmk, ap_mac, client_mac, ap_nonce, client_nonce): PTK由PMK加MAC地址和Nonce共同派生。 其中用到PRF-512函数内部是多次HMAC-SHA1拼接。 这里做了关键步骤的简化处理。 data min(ap_mac, client_mac) max(ap_mac, client_mac) min(ap_nonce, client_nonce) max(ap_nonce, client_nonce) ptk b for i in range(1, 3): hmac_res HMAC.new(pmk, data i.to_bytes(1, big), SHA1).digest() ptk hmac_res return ptk[:64] def verify_mic(psk, ssid, ap_mac, client_mac, ap_nonce, client_nonce, eapol_frame, mic_to_verify): 还原MIC并进行比对。 真正的EAPOL帧里包含很多字段实际比对时要把MIC字段位置清零。 pmk generate_pmk(psk, ssid) ptk generate_ptk(pmk, ap_mac, client_mac, ap_nonce, client_nonce) kck ptk[:16] # 前16字节是KCK用于计算MIC # 对eapol_frame计算HMAC-SHA1的前16字节 mic HMAC.new(kck, eapol_frame, SHA1).digest()[:16] return mic mic_to_verify这段代码的注释已经比较详尽我要额外说明几个细节PBKDF2的4096次迭代是WPA2协议的硬性规定这是为了拖慢暴力破解的速度而刻意设计的安全机制。所以不要试图修改这里的迭代次数去“优化性能”改了校验值就对不上了。PTK的派生函数是PRF-512它内部不是只做两次HMAC就结束而是根据输出长度循环调用。我给的代码片段是为了展示算法逻辑实际工程实现里标准的PRF函数需要写得更严谨。在Python里做全字典的MIC比较速度是非常慢的纯CPU大概每秒只能跑几百到上千个密码。所以这个脚本的主要用途是加深理解而不是生产环境下的破解工具。4. 命令行实战跑通一次完整的密码验证4.1 用aircrack-ng执行字典攻击理解了原理后制胜的关键一步其实就是简单的一条命令。使用Aircrack-ng套件对前面抓到的握手包执行字典攻击aircrack-ng -w wifi_dict_uniq.txt -b 00:11:22:33:44:55 cap-01.cap命令参数解释-w指定字典文件路径。-b指定目标BSSID避免打开文件后需要手动交互选择目标。cap-01.cap就是之前用airodump-ng抓到的原始报文文件。执行后屏幕上会逐行显示尝试进度、当前测试的密码以及每秒尝试次数。如果字典里恰好有正确密码会提示KEY FOUND!并直接显示密码内容。整个过程快则几十秒慢则数小时完全取决于字典大小和密码位置。如果手头没有Aircrack-ng用hashcat加显卡跑也是一条路速度能提升几十倍。hashcat的WiFi握手包模式是-m 22000但它需要先把.cap文件转换成.hc22000格式转换工具是hcxpcapngtoolhcxpcapngtool -o handshake.hc22000 cap-01.cap hashcat -m 22000 -a 0 handshake.hc22000 wifi_dict_uniq.txt显卡跑字典的好处在于WPA2的PBKDF2计算特别适合GPU的并行架构一块入门的RTX 3050就能轻松达到每秒几百万次猜测这是CPU完全无法相比的。4.2 提速与选字典的几个实操心得根据我的经验很多人卡死在一台路由器上跑了一整晚没结果原因基本都在字典上而不是硬件上。第一字典要分级。初级字典不要太大先把最常用的几千条口令放进去比如“12345678”“88888888”“admin123”这类。很多家庭路由器用的密码远比你想象的简单甚至有人拿默认密码跑完一圈回来发现路由器根本没改过初始密码。第二定向收集比广撒网更有效。如果你做的是公司网络测试务必把公司相关词汇加进去这种命中率往往比几十个G的通用字典还高。第三尽量清理掉重复项一来节省IO开销二来在hashcat里重复的密码会导致计算资源浪费。我这里再分享一个自己在做安全评估时积累的字典分级思路字典级别口令数量级适用场景建议篡改的要素初级字典1K ~ 10K快速验证弱口令常见数字组合、纯单词、默认口令中级字典100K ~ 1M家庭网络定向测试姓名拼音、生日、手机号、常见变形高级字典1M以上企业网络定向测试公司缩写、部门名、办公地址、年份超大字典10M以上显卡集群极限测试社工组合全量、泄露数据重组这张表不是严格的分类标准而是我自己做事时的一个习惯。核心原则是低级别字典追求命中速度高级别字典追求覆盖广度你实际用哪一级取决于测试目标的重要性和授权范围。5. 常见报错与排查经验5.1 抓不到握手包的几种情况我在带新人做实验时碰到的第一个高频问题就是盯了半天airodump-ng界面右上角始终不出现WPA handshake提示。排查顺序一般如下确认目标网络加密方式是WPA/WPA2而不是WPA3。WPA3使用了不同的握手机制SAEAircrack-ng到目前为止实测表现都比较吃力。如果你看到目标网络写着SAE那就别浪费时间了。确认有没有抓到正确的信道上。airodump-ng监听的-c参数必须和目标路由器的信道一致否则拿不到任何数据。确认deauth攻击生效。发送deauth后观察客户端会不会立刻断开并重新认证。有些新路由器有防deauth机制需要多轮尝试或提高发包频率。如果一切正常成功抓到一次握手包后airodump-ng窗口左上角会出现一行绿色的WPA handshake字样同时在当前目录下生成cap-01.cap文件。5.2 字典跑得慢先看这几项配置这里整理了一份我实测用过的问题排查速查表覆盖面还挺全现象可能原因解决方式每秒尝试次数极低使用了CPU模式而非GPU切换到hashcat检查显卡是否被识别提示No networks found网卡未进入监听模式或驱动异常换一个USB接口重插重新执行airmon-ng start提示Interface is not on channel网卡信道漂移vicinity存在信道干扰重新用-c固定信道必要时重启监听模式接口跑字典时网络断开airmon-ng check kill把网络管理服务停了属于正常现象测试完用service NetworkManager start恢复hashcat报CLBuildProgram错误OpenCL环境没配好安装NVIDIA CUDA Toolkit或对应的AMD ROCm驱动有握手包但一直不匹配字典里没覆盖正确密码或抓包数据不完整重新抓握手包或者换一套字典再试5.3 合法测试场景下的避坑建议无论你的目的是学习还是工作以下几个建议能帮你少走弯路也能避免给自己惹上不必要的麻烦再三确认测试对象。我只在自购设备或者和对方签订了测试授权书的网络上做实验这一点没有例外。哪怕只是扫描一个陌生WiFi的BSSID也可能被认定为违法这是实际案件里反复出现的教训。测试完成后及时关闭监听模式并把airmon-ng创建的虚拟接口清理干净避免影响后续正常的WiFi联网使用。执行sudo airmon-ng stop wlan0mon即可恢复网卡普通模式。生成的字典和抓包文件属于敏感数据建议测试完成后妥善删除或加密保存不要随意传到网盘或Git仓库。6. 防御视角知道了破解原理更要学会防护6.1 从攻击端反推防御要点写了这么多代码和操作让我换到防守方的视角说说怎么避免自己的WiFi被字典攻击命中。第一杜绝弱密码。这一点最基础也最容易被忽略。很多人嫌长密码输入麻烦选了个8位的数字组合或纯拼音这等于把大门钥匙藏在了门口花盆底下。实测下来8位纯数字字典在GPU上跑几乎是秒破的甚至不需要专门的社会工程学定制通用字典就能覆盖。第二关闭WPSWiFi Protected Setup。WPS是很多路由器默认开启的一个“便捷”配对功能它允许通过PIN码来连接设备。问题在于WPS的PIN码只有8位且其校验机制本身有设计缺陷第三方工具可以在很短的时间内暴力穷举出正确的PIN码。一旦PIN码被攻破即使你的WiFi密码再复杂攻击者也能直接进入网络。关闭WPS等于堵死了一个极为重要的后门。第三优先选用WPA3加密。如果在你的设备都支持的条件下把路由器加密方式设置为WPA3。WPA3使用SAESimultaneous Authentication of Equals协议从原理上削弱了离线字典攻击的有效性——即使在握手阶段抓取了通信数据攻击者也无法在本地无限次尝试猜测密码因为SAE协议中加入了“握手会话密钥确认”的流程使得每次尝试都必须与路由器进行实时交互这极大地降低了攻击速度。没有WPA3时确保使用WPA2且密码长度不低于12位混合大小写、数字和特殊字符。第四定期更换密码并关注固件升级。路由器厂商会不定期更新固件修复安全漏洞尤其是针对各类拒绝服务攻击和协议层漏洞的补丁。我的习惯是每三个月更换一次家用WiFi密码同时把路由器的管理后台地址设为非默认值关闭远程管理功能。6.2 我的个人感受我见过太多人对WiFi安全的态度是“反正没人蹭我家网”直到有一天发现家里智能摄像头被陌生设备绑定或者以为是电视在偷流量查下来才发现路由器早就被人悄悄接入了。这个项目的技术含量其实并不高从原理到工具都是公开资料里现成的东西但它最大的价值在于让人真正意识到安全从来不是靠侥幸。Python在这个场景里重新向我证明了一件事——语言本身不是关键理解协议、善用工具、尊重边界才是关键。当你愿意为一个“破解”流程去研究PBKDF2的实现细节时其实你已经在用攻防两端的视角重新审视网络世界了。最后分享一个实操中的小技巧如果你打算长期做无线安全测试强烈建议把常用工具链封装成一个Docker镜像包括aircrack-ng、hashcat、hcxtools以及你的Python字典生成脚本。这样换机器、迁移环境时一条docker run命令就能恢复整个工作台。我最近一次做内网评估从插上网卡到跑出结果只花了不到30分钟省去了大量重新配置环境的时间。安全测试这条路上效率往往也是决定一个测试能否按期完成的关键因素。本文还有配套的精品资源点击获取