WPA2/WPA3四次握手与WiFi口令熵安全自查指南

发布时间:2026/10/29 23:42:44
WPA2/WPA3四次握手与WiFi口令熵安全自查指南 简介无线网络安全的基础不是“破解WiFi密码”而是理解WPA2/WPA3的鉴权链路与口令强度。PSK经PBKDF2派生PMK四次握手再生成PTK并用MIC校验握手材料一旦可被离线比对字典攻击成本就取决于口令熵。把密码强度从手感判断变成可量化数字再结合WPS、管理面暴露、远程管理等检查项才能形成可复测的WiFi安全自查闭环。面向家庭和小型办公无线网络在授权范围内完成扫描、熵评估、整改与复测并沉淀为可自动执行的口令策略。1. 当有人问「破解 WiFi 密码」到底难不难先分清自己站在哪一侧「破解 WiFi 密码」这句话在搜索框里挂了十几年点进去十篇有九篇教人抓握手包跑字典剩下一篇在卖网卡。我在某实验室做内部安全培训时第一个被问住的问题永远是同一个隔壁信号满格要不要试试。我的回答从来没变过——未授权的接入尝试不是技术问题是法律问题《网络安全法》和刑法二百八十五条写得很清楚所以这篇笔记写的是另一侧把 WPA2/WPA3 的鉴权链路拆开搞清楚口令在四次握手里到底处在什么位置然后回到自己的路由器上做一次能量化的自查。适合自己管着家庭或小型办公无线网络、又想把「密码够不够强」从手感判断变成数字判断的人。2. WPA2/WPA3 的鉴权链路口令在四次握手里到底藏哪儿2.1 PSK、PMK、PTK一条口令走完的三段路很多人以为连 WiFi 的时候路由器会核对密码本身其实不是。整个过程里明文口令从来没有在空口上跑过一次真正被比对的是一个由口令派生出来的密钥校验值。这条链路分三段第一段是派生。客户端把「口令 SSID」丢进 PBKDF2-HMAC-SHA1迭代 4096 次输出 256 bit 的 PMKPairwise Master Key。注意 SSID 是参与运算的所以同一个口令挂在不同 SSID 下算出来的 PMK 完全不同——这解释了一个常被问到的现象把路由器 SSID 改个名所有设备都得重新输一遍密码。第二段是握手。四次握手交换的是 ANonceAP 侧随机数、SNonce客户端侧随机数和双方的 MAC 地址两边用这些材料把 PMK 扩展成 PTK再用 PTK 的某一段算出一个 MIC 值互相比对。比对通过链路建立。第三段是加密。PTK 再拆分成加密密钥和完整性密钥后面所有单播数据都用它保护。这段链路可以自己复现一遍纯计算、不碰任何空口import hashlib import binascii def derive_pmk(passphrase: str, ssid: str) - bytes: 按 WPA2-PSK 规范从口令和 SSID 推导 PMK。 用途核对自己网络的口令派生结果验证配置一致性。 return hashlib.pbkdf2_hmac( sha1, passphrase.encode(utf-8), # 口令规范要求 8~63 个 ASCII 字符 ssid.encode(utf-8), # SSID 作为盐参与运算 4096, # 迭代次数WPA2-PSK 固定值 dklen32, # 输出长度 256 bit ) pmk derive_pmk(a-sample-passphrase-2024, MyOffice-5G) print(binascii.hexlify(pmk).decode())三个参数值得单独说。passphrase在规范里限定 8 到 63 个字符短于 8 位路由器根本不让你设ssid必须是字节级精确匹配前后带空格、大小写不同都会算出完全不一样的 PMK这也是为什么有人改完 SSID 后发现老设备疯狂重连失败4096这个迭代次数是 WPA2 定死的改不了它的存在是为了让单次派生变慢但在现代 GPU 面前这个「慢」已经不太够看。把这段跑通的意义在于你手上有了一个可以离线验证口令的工具不需要碰任何别人的网络就能确认自己设的那串东西是不是真的按预期工作。2.2 握手包能拿到什么、拿不到什么离线成本的边界上一节说口令不上空口那为什么弱口令还是危险关键在于四次握手里那几个值——ANonce、SNonce、双方 MAC、MIC——全部是明文传输的。攻击者只要把这一组值录下来就可以在自己机器上做一件事猜一个口令按 2.1 的流程算 PMK、算 PTK、算 MIC跟录到的 MIC 比。相等就说明猜对了。这个过程完全离线不需要再跟目标 AP 有任何交互也不需要受害者在线。这就是「字典攻击」在无线场景成立的根因也是为什么口令强度直接等于安全强度——AP 那边没有任何限速、锁定、验证码机制能帮上忙防线全压在你设的那串字符上。我把常见口令构成的搜索空间列一下速度按单卡每秒十万次这个量级估算只做数量级参考实际取决于硬件口令构成字符集大小8 位口令空间期望耗时10 万次/秒纯数字101.0×10^8约 8 分钟纯小写字母262.1×10^11约 12 天大小写字母525.3×10^13约 8.4 年大小写 数字622.2×10^14约 34 年95 个可打印字符956.6×10^15约 1000 年这张表最容易被误读。它假设口令是均匀随机的而人挑口令从来不均匀——「Password2024」「Wifi123456」这类东西根本不用枚举字典前一万条就命中了。所以真正的结论不是「凑到 12 位就安全」而是「口令必须避开人类选词的分布」。顺带说一个必须点明的边界让已连接的设备强制掉线再重连从而更快地录到握手这属于干扰他人通信不管目标是隔壁还是公司都不该做。我在培训里见过新人拿这个当「技巧」炫耀血泪经验是这条路往前一步就是违法没有任何技术理由值得去走。2.3 加密模式选型WPA2-PSK、WPA2-Enterprise、WPA3-SAE 的取舍搞清楚原理之后选型就是一件很实际的事。三种模式的核心差别在于「口令被离线验证的难度」模式鉴权方式口令被离线验证适用场景主要代价WPA2-PSK预共享密钥容易一次握手即可反复验证家庭、小型办公一人泄露全员换密WPA2-Enterprise802.1X RADIUS需在线交互难离线企业、多人员环境要维护认证服务器与证书WPA3-SAE对等 Simultaneous Authentication of Equal单次猜测必须在线交互新设备为主的环境老设备兼容性差WPA3 的 SAE 是这里唯一的结构性改进每次猜测都必须跟 AP 实时交互一次攻击者拿不到可以离线反复试的材料字典攻击的成本从「本地跑」变成「网络上一次次握手」直接高了好几个数量级。但现实里的坑在于过渡模式——为了兼容不支持 SAE 的老设备很多路由器会开 WPA2/WPA3 混合这时候任何一台只支持 WPA2 的设备连上来那一轮的强度就退回 WPA2 的水平。我一般这么配主 SSID 只开 WPA3-SAE把智能插座、老款打印机这些不支持的设备单独扔到一个隔离的 WPA2 SSID 上开客户端隔离、限速、关掉内网互访。这样既不用为了几台老设备牺牲主线也不至于让它们成为整个网络的短板。3. 自家网络的安全自查从被动扫描到口令熵评估3.1 被动扫描先把自家 AP 的加密参数读准动手改任何配置之前先看清楚现状。Linux 下最直接的是iw它读的是内核里的扫描结果# 列出周边所有 AP 的 BSSID、SSID 和安全配置 # wlan0 换成自己实际的无线网卡名可用 ip link 查看 sudo ip link set wlan0 up sudo iw dev wlan0 scan | awk /^BSS/ { bss $2 } /SSID:/ { ssid substr($0, index($0,SSID:)5) } /RSN:|WPA:/ { print bss, |, ssid, |, $0 } | head -40这段 awk 的逻辑很简单遇到BSS行记下当前 AP 的 BSSID遇到SSID:行记下名字遇到RSN:或WPA:行就把加密信息打出来。RSN是 WPA2/WPA3 的信息元素WPA是老的 WPA1。如果某个 AP 压根没有这两行说明它是开放网络或者只开了 WEP。更省事的做法是用 NetworkManager 自带的命令输出是表格适合快速核对# 强制重新扫描并输出 SSID、BSSID、安全类型、信号强度 nmcli -f SSID,BSSID,SECURITY,SIGNAL dev wifi list --rescan yes看输出的时候重点盯SECURITY这一列。显示WPA2说明是 PSK显示WPA3说明是 SAE显示WPA2 WPA3就是混合过渡模式如果显示为空或者--那就是完全开放的。信号强度那一列可以用来判断哪个 BSSID 是自己家的——同一台路由器 2.4G 和 5G 通常是两个不同 BSSID。提示扫描本身是接收广播帧不涉及任何接入行为。但只在自己家和已授权的办公环境里跑别拿着网卡去扫整栋楼然后逐个试。3.2 口令熵把「够不够强」换成可比较的数字人判断口令强度全靠感觉而感觉极不可靠。我把这件事拆成一个能跑的脚本输入口令输出估算熵值和一个期望破解时间import math import string CLASSES [ (string.ascii_lowercase, 26), (string.ascii_uppercase, 26), (string.digits, 10), (string.punctuation, 32), ] def effective_charset(pwd: str) - int: 统计口令实际用到了几类字符累加对应的字符集大小 size 0 for chars, n in CLASSES: if any(c in chars for c in pwd): size n return size or 1 def entropy_bits(pwd: str) - float: 暴力枚举模型下的熵估计长度 × log2(字符集大小) return len(pwd) * math.log2(effective_charset(pwd)) def expected_seconds(bits: float, rate: float 1e5) - float: 期望尝试次数取空间的一半rate 是每秒尝试次数 return (2 ** bits) / 2 / rate samples [ 12345678, welcome2024, Tr0ub4dor3, my-office-wifi-2024, ] for p in samples: b entropy_bits(p) print(f{p:22} 熵≈{b:6.1f} bit 10万次/秒下≈{expected_seconds(b):.2e} 秒)逻辑上分三步先判断口令里出现了哪几类字符把字符集大小加起来再用「长度 × log2(字符集大小)」估算暴力枚举下的比特数最后按每秒尝试次数换算期望时间。rate这个参数别用默认值糊弄拿自己机器实测一个数填进去结论才有意义。这个模型有个必须知道的偏差它对随机串估得准对「单词拼接」会严重高估。my-office-wifi-2024算出来熵很高但如果攻击字典里收录了office、wifi、年份后缀这些常见组合实际破解成本会掉好几个数量级。所以我一般会跑第二遍交叉验证——拿一份公开的常见口令词典看目标口令的前缀、后缀是否命中词表里的片段命中就打折。纯靠公式下结论翻车概率很高。一个实操习惯把熵阈值定在 80 bit 以上然后优先选长度而不是复杂度。20 位纯小写字母的熵是 94 bit比 10 位「大小写数字符号」的 65 bit 高得多而且好记好输。3.3 路由器管理面自查WPS、默认口令、远程管理空口这一侧再强管理面塌了也白搭。这几项挨个过一遍检查项风险点整改动作WPS PIN 码8 位 PIN 分两段校验有效搜索空间极小后台彻底关闭 WPS包括 PBC 按钮模式管理后台口令出厂默认值全网可查改成长随机串不与 WiFi 口令复用WAN 侧远程管理管理页面暴露到公网关闭只允许 LAN 侧访问UPnP内网设备可自行开端口映射不需要就关掉固件版本老版本的历史问题升级到厂商当前版本访客网络隔离访客能横向访问内网设备开启客户端隔离加密模式停在 WPA2 或混合模式按 2.3 的方案分层配置管理面是否暴露在 LAN 侧可以用端口扫描确认一下# 在自己网段内检查路由器管理面开放了哪些端口 # 192.168.1.1 换成自己网关地址用 ip route 查默认网关 nmap -sT -p 22,23,80,443,8080,8443 192.168.1.1-sT是完整 TCP 连接扫描不需要 root 也不需要构造原始包最不容易被误判成攻击-p后面列的这几个端口覆盖了常见的管理入口——23 是 Telnet一旦开着基本等于把设备交出去。扫描结果里open的端口逐个回后台确认是不是真的需要。注意这段只对自己网段的网关地址跑。换成别人的网段就是另一回事了性质完全不同。4. 授权测试的边界与记录一份能落地的自查清单4.1 授权三要素范围、时间窗、回滚真要在办公环境做无线自查口头同意不算数。我坚持每次都把三件事写清楚范围——具体到 SSID 和 BSSID 列表。写「公司 WiFi」是不合格的因为同一栋楼里可能有访客网、IoT 网、测试网好几套漏掉的那些出事没人认。时间窗——精确到小时。无线环境会随人员流动变化超出时间窗的操作没法用当时的现场状态解释。回滚——每一项改动怎么退回去。改加密模式、关 WPS、改管理口令每一条都要写清楚原值和恢复步骤。我见过有人把管理口令改完没记最后只能捅复位孔整台设备的配置全丢。这三条不是流程洁癖。无线问题是「事后无法取证」的典型场景今天改了什么一周后没人说得清只有记录能说话。4.2 自查记录表字段怎么设计表格字段不用多但每一个都要能支撑复测字段示例值用途SSIDMyOffice-5G标识网络BSSIDaa:bb:cc:dd:ee:01精确定位到具体 AP避免同名混淆加密模式WPA3-SAE整改前后对比口令熵估计94 bit量化强度词典命中片段无修正熵估计WPS 状态关闭含 PBC确认整改彻底管理面开放端口80收敛暴露面整改人 / 日期A 同学 / 2024-06-11责任可追溯复测结果通过闭环填表时最容易糊弄的是 BSSID 那一列。有人图省事只写 SSID结果复测时发现「同一个名字」的加密模式变了实际上改的是另一台 AP——mesh 组网里同名 SSID 挂多个 BSSID 太常见了不落到 BSSID 级别记录等于没记。4.3 复测闭环怎么证明整改真的生效整改完不复测等于没整改。复测我固定跑三步第一步重扫。用 3.1 的nmcli命令重新拉一遍列表确认目标 BSSID 的SECURITY列已经变成预期值。这一步能抓出「后台显示改了但没生效」的情况老固件上偶发。第二步重跑熵脚本。如果换了新口令把新口令丢进 3.2 的脚本确认熵值达标且词典片段检查为无命中。第三步实连。拿一台真设备连一次确认能正常拿到地址、能通外网。这一步专门用来抓兼容性回归——改加密模式之后老设备连不上是最常见的翻车点而且往往要等使用者来报才发现。三步都过了才在记录表的复测结果里写「通过」。少一步都不算。5. 避坑五个真踩过的点按现象倒推原因5.1 扫描与识别环节的坑现象iw scan输出里翻不到自己家的 SSID。原因通常有三个一是接口没 upip link里显示DOWN的时候扫描直接返回空二是 AP 关了 SSID 广播这时它会以隐藏形式出现SSID 那行是空的得靠 BSSID 反查三是网卡当时挂在 5G 信道而目标只在 2.4G扫描虽然会遍历信道但受驱动和区域设置影响偶尔漏掉。解决顺序是先ip link set wlan0 up再按 BSSID 过滤最后换一个物理位置重扫避开死角。现象熵脚本算出来 100 bit 以上但实际口令弱得一批。原因是公式假设字符均匀随机而人写口令时会拼常见词、加年份、首字母大写。Summer2024!这种在公式里能算出 70 多 bit在真实字典里可能排前几千条。解决办法是加一层词表交叉检查把口令按分隔符和常见后缀切开逐段去公开常见词表里查命中就按命中片段的实际候选数重算别信公式的原始值。现象记录表里 BSSID 和路由器背面贴的 MAC 对不上。原因在于 BSSID 是无线接口的地址跟设备铭牌上的 LAN MAC 通常不是同一个mesh 组网里每个节点还有各自的 BSSID回程链路又可能是另一个。解决办法是别拿铭牌做基准以扫描结果为准同时在记录里补一列「节点位置」用物理位置把 BSSID 和人能理解的方位对应起来。5.2 整改与复测环节的坑现象后台确认关了 WPS扫描工具仍然报 WPS 可用。原因是很多固件把 WPS 拆成了两套开关——PIN 模式和 PBC 按钮模式关掉前者后者还在还有些老固件干脆是「界面关了但服务没停」。解决办法是先升级固件再逐项确认 PIN 和 PBC 都关最后用扫描工具复查信息元素里还有没有 WPS 相关字段界面说关了不算数。现象主 SSID 切到 WPA3 后一批设备连不上回退到混合模式又觉得不安全。原因是这些设备只实现了 WPA2-PSK碰到 SAE 直接握手失败。回退混合模式会让它们把整体强度拉回 WPA2 水平这不是配置错误是结构性的。解决办法是分层主 SSID 纯 WPA3另开一个只给老设备的 WPA2 SSID开客户端隔离、关掉内网互访、单独限速把兼容性和强度分开处理而不是在同一个 SSID 上妥协。现象改完管理口令第二天自己登不进去了。原因多半是口令太长、用了特殊字符而某些路由器的管理页面表单对特殊字符处理有 bug实际存进去的是被截断或转义后的值。解决办法是管理口令限定在大小写字母加数字这个安全子集里长度拉到 24 位以上强度靠长度而不是符号然后把口令存进密码管理器别靠脑子记。6. 进阶把口令策略做成一条能自动跑的规则前面几章都是单点动作真正省事的是把「生成—校验—记录」串成一条自动流程。我现在的做法是新网络上线前先用secrets生成候选口令再用 3.2 的熵函数和词表检查双重校验两项都过才写进配置。import secrets import string SAFE_ALPHABET string.ascii_letters string.digits # 避开管理页面的转义坑 def gen_passphrase(length: int 24) - str: 生成 24 位随机口令熵约 143 bit强度靠长度而非符号 return .join(secrets.choice(SAFE_ALPHABET) for _ in range(length)) def check(pwd: str, min_bits: float 80.0) - bool: 双重校验公式熵 长度下限 if len(pwd) 16: return False return entropy_bits(pwd) min_bits # entropy_bits 复用 3.2 的实现 candidate gen_passphrase() assert check(candidate), 候选口令未达标重新生成 print(candidate)secrets.choice走的是操作系统级随机源不能用random.choice替代——后者是可预测的伪随机拿来生成密钥等于自己给自己挖坑。SAFE_ALPHABET刻意剔除了标点就是为了避开上一章那个管理页面转义的坑24 位字母数字的熵已经到 143 bit靠长度换强度输入端也不用受罪。比脚本更值得固化的是一张规则表写进团队的无线配置基线里规则项取值要求最低熵阈值80 bit短语口令需经词表校验后仍达标最短长度16 位管理面口令 24 位字符集字母 数字管理面禁用特殊符号轮换触发条件人员变动、设备丢失、口令经手超过两人复用禁令WiFi 口令、管理口令、其他系统口令三者互不复用例外管理老设备专用 SSID 单独登记季度复核是否可下线轮换那条我改过好几次。早期定的是「每 90 天强制换」实际执行下来发现纯属自欺欺人——为了好记大家换出来的口令往往是老口令加个数字熵没涨多少倒是把所有人的记忆负担拉满了。后来改成事件触发只在人员变动、设备丢失、口令扩散这几个真实风险点上换配合长随机口令效果反而扎实。还有一个细节老设备专用 SSID 那张表要定期翻。我见过一个开了三年的 IoT 隔离网里面挂了二十多台设备其中一半早就报废没人用了但口令还在有效状态。季度复核的时候把「登记在册但连续 30 天无连接」的条目清掉比换密码有用得多。从那以后我每次给新网络设口令都强制走一遍「生成—熵校验—词表交叉检查—写进密码管理器」这四步不跳步、不凭手感。翻车的代价从来不在设口令那五分钟而在半年后没人说得清这个网到底谁能进。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询