WiFi密码是怎么被验证的?四次握手全程不传密码,万能钥匙的真相我拆明白了

上礼拜朋友慌慌张张发消息,说有人在楼下拿笔记本电脑蹲了半天,屏幕上一行行滚数据,问我是不是WiFi密码被偷了。我让他先放宽心:就是蹲一年,那人也抓不到你输的密码本体。他更懵了——抓不到密码,我家网之前是怎么被邻居蹭上的?这篇就把这两件事掰开讲:密码到底怎么被验证的,以及被「破」掉的究竟是哪一环。
先撂结论:你输的密码,从来没在网上跑过
很多人想象里,连WiFi就是把密码发给路由器,路由器掏出小本本一对:对上了,放行。真这么干,抓包的人早发财了——密码在空气里飞一趟,半路就被截下来了。
实际的路子是反着来的。你家路由器本来就知道密码(那是你自己设进它肚子里的),你的手机也知道(你输过,存在本机)。两台都知道密码的机器,要确认的是「对方真知道」,根本犯不着把密码发来发去,而是拿密码当场算一道只有知道密码的人才能算对的题。这套确认流程就是四次握手,全程不到两秒,你状态栏里那个小转圈转着的时候,它俩就在干这个。
所以在楼下抓包的人,能抓到你们交换的题目和答案,唯独抓不到密码本身。这不是路由器仁慈,是协议从设计那天起,就没给密码出厂的机会。
握手之前先干一件事:拿密码搅4096轮
正式握手前,两边要先把密码加工成一份「底料」,行话叫PMK。加工方式听着挺粗暴:底料 = PBKDF2(密码, WiFi名, 4096轮)——你的密码加上WiFi名字,扔进哈希函数里搅四千零九十六圈,出来一段谁也认不出原样的乱码。
我在电脑上跑过一遍这个东西,有个细节特别有意思。同一个密码「wojia2010」,配WiFi名「Home」算出来的底料是0588fdf1开头,配「Home5G」算出来是93d538cb开头,完全两码事;但只要名字和密码都不动,算一万遍,结果一模一样。
这一下就解释了你肯定遇到过的事:路由器改个WiFi名,明明密码没动,全家设备全得重新输入——底料是拿名字一起算的,名字一改,底料全换,旧钥匙开不了新锁。反过来,换新路由器时把WiFi名和密码照抄旧机器,几十台设备无感就连上了,也是同一个原理:造钥匙的材料没变,钥匙就没变。
四次握手拆开看:明文飞的只有随机数,密码当酵母藏在成品里
底料备好,开始握手。术语不用记,记住一个比喻就行:两边互发随机数当面粉,密码当酵母——酵母从头到尾待在各自家里,最后双方各自在家烤出同一块面包。
| 第几步 | 谁发给谁 | 发的是什么 | 明文吗 |
| ① | 路由器→手机 | 随机数A | 明文 |
| ② | 手机→路由器 | 随机数B+盖好章的凭据(MIC) | 随机数明文,章是算出来的 |
| ③ | 路由器→手机 | 验章通过,发组播钥匙GTK | 加密 |
| ④ | 双向 | 此后每一帧都用新钥匙加密 | —— |
中间那步是灵魂:两边各拿同一份底料,加上互发的随机数A和B,再加上对方的MAC地址(就是设备的身份证号),各自算出一把本次连接专属的钥匙。手机拿这把钥匙给一段固定的话盖个章发过去,路由器自己也算一遍章,俩章一对——对上了,说明这手机真知道密码。全程密码和底料都没出过门,门外飞的只有随机数和盖好章的成品。
这套设计里还有两处挺妙的地方。钥匙里掺了随机数,随机数每连一次都换,所以你家钥匙今天连和明天连不一样,抓包的人就算抄走了这一次的成品,下次也不作数;手机和电视连同一个路由器,俩人的钥匙也各是各的,一台设备的钥匙漏了,殃及不了别的设备。
密码不上线,那别人是怎么连上你家的
回到开头的问题。抓包抓不到密码,你家网照样被蹭,路子主要就两条,而且头一条占九成。
第一条跟破解半毛钱关系没有:万能钥匙这类软件,工作机制是「人人为我、我为人人」的密码共享池。谁装了它来连你家WiFi、输对了密码,这串密码就被明文传上它的云端共享库。下一个走到你家楼下的人打开软件,软件从库里捞出你家这串,自动填上——看着像「破解」,其实是前面某个连过你家网的人,把钥匙复印了一份挂到了网上。最冤的一种是主人自己装它连自家WiFi,等于亲手把自家密码贡献进了库。想查谁连过、怎么防,防蹭网那篇写得更细。
第二条才是真刀真枪的技术路线:抓握手包,回家慢慢试。握手里飞的随机数和章,抓包是能抓到的。攻击者拿一本字典回家挨个试:假设密码是「12345678」——算底料、算钥匙、算章,跟抓到的章一比,不一样就换下一个候选。整个过程不需要路由器参与,在自己电脑上离线跑,所以叫离线爆破。
协议设计者也防了这一手:那4096轮搅动不是白搅的,就是故意拖慢计算速度的减速带。我拿书房那台老台式机实测,一秒钟只能算四百多次。听着还行?往下看账。
密码多长才扛得住:我拿自家电脑跑了圈账
爆破拼的就是组合数,密码每长一位、字符池每大一点,组合数都翻着倍地涨。实测的账摆在这(单线程口径,攻击者上了显卡还能快几百上千倍,但相对关系不变):
| 密码样式 | 组合数 | 我家老台式机单线程 | 换块显卡之后 |
| 8位纯数字 | 1亿种 | 约61小时 | 几分钟到几十分钟 |
| 10位纯数字 | 100亿种 | 大半年 | 几小时 |
| 8位小写字母加数字 | 2.8万亿种 | 约200年 | 几个月,多卡几天 |
| 12位大小写加符号 | 10的23次方量级 | 33万亿年 | 等宇宙重启都跑不完 |
规律简单粗暴:长度比花哨管用。8位纯数字在显卡面前跟没设一样;拉到12位以上、大小写数字符号混着来,光组合数就到了10的23次方这个量级,全世界的算力堆上去也白搭。记不住乱码就用一句没人猜得到的长话,比如「我家路由器2019年花129买的」,19个字,长度照样碾压绝大多数字典。
另外WPA3路由器把离线爆破这条路直接堵死了:它换了套叫SAE的验证方式,每试一个密码都必须跟路由器在线一来一回,抓包回家离线试不了,试错几次还会被冷落。所以WPA2和WPA3那篇劝你新设备尽量上WPA3,不是图新鲜,是真多了一堵墙。老路由器只有WPA2的话,把密码设长设杂,就是你能做的全部。
家里能做的四件事,按要紧程度排
第一件,把密码换成12位以上的混合,或者一句长话。性价比最高的一步,一分钟的事,直接让绝大多数蹭网的人死心。
第二件,别装来路不明的「钥匙」类软件,也提醒家里长辈别装。你家被蹭多半不是被破了,是被共享了。给客人连网最好开个访客网络,密码单独设——客人那头再怎么共享,也够不着你的主网,隔离一开连家里NAS都摸不到。
第三件,把WPS关了。WPS的PIN码是8位数字,等于在你那堵12位混合的高墙旁边开了扇纸糊的小门,老路由器上这扇门尤其好踹。
第四件,老掉牙的加密方式别再用。后台加密选项里要是还挂着WEP或者WPA加TKIP这种十几年前的老古董,趁早换成WPA2或WPA2/WPA3混合。WEP那种加密是真能被几分钟现场破解的,跟你密码设多长都没关系。
收尾给自己留个念想:连WiFi这件事,从手机搜到名字(路由器每0.1秒广播一次,扫描那篇写过),到这儿的四次握手,再到DHCP发门牌,前前后后就两三秒。你多等的那两秒里,装着的是一套用了二十年还在扛的规矩。

发表评论