首先,我们需要了解一种数学运算,它被称为哈希算法(hash)。哈希算法可以将任意长度的二进制值映射为较短的固定长度的二进制值,这个较短的二进制值被称为哈希值。哈希值是一种紧凑且唯一表示数据的数值形式。即使只更改了原始数据中的一个字母,计算后的哈希值也会完全不同。哈希值可以用于验证数据的完整性,并且常用于快速查找和加密算法。
哈希算法是一种不可逆运算,即无法通过运算结果逆推出原始数据。有时,我们需要确保不同的输入通过哈希算法计算后得到的结果也不相同。这意味着很难找到两个不同的值,它们通过哈希算法得到相同的结果。哈希算法是一类公开的算法,例如MD5和SHA-1等。我们通常所说的WPA密码实际上是PSK(pre-shared key),长度通常为8-63字节。通过一定的算法,将PSK和SSID结合起来可以得到PMK(pairwise master key)。PMK的长度固定为64字节。由于计算PMK的过程开销较大,这是破解过程中耗时较长的关键步骤。因此,我们采用以空间换时间的原则,预先生成PMK表,这个表被称为哈希表(生成PMK的算法就是一种哈希算法)。我们使用airlib-ng工具来完成这个预先生成的工作,从而实现快速破解。在认证过程中,会生成一个PTK(pairwise temporary key),它是一组密钥,具体细节不再详述。PTK的生成也采用了哈希算法,参数包括连接的客户端MAC地址、AP的BSSID、A-NONCE、S-NONCE和PMK。其中,A-NONCE和S-NONCE是两个随机数,确保每次连接都会生成不同的PTK。PTK的计算消耗较小。PTK与报文数据结合使用一定的算法(如AES或TKIP),生成密文,并同时生成一个签名,称为MIC(message integrality check)。TKIP的破解与MIC有很大关系。四次握手包中包含了哪些信息呢?包括客户端的MAC地址、AP的BSSID、A-NONCE、S-NONCE和MIC。最关键的是,PMK和PTK并不包含在握手包中。在认证过程中,客户端在获得上述所有参数后,计算出一个MIC,并将原始数据与MIC一起发送给AP。AP使用相同的参数和算法计算出MIC,并与客户端发送的MIC进行比较。如果一致,则认证通过;否则,认证失败。目前的破解方法是,我们获取握手包后,使用字典中的PSK+SSID先生成PMK(如果有哈希表,则可以跳过这一步),然后结合握手包中的客户端MAC地址、AP的BSSID、A-NONCE和S-NONCE计算PTK,再加上原始的报文数据计算出MIC,并与AP发送的MIC进行比较。如果一致,那么该PSK就是密钥。目前最耗时的步骤是计算PMK,这可以说是破解的瓶颈。即使解决了计算量的问题,海量密钥的存储也是一个问题(PMK的长度都是64字节)。最近出现的tkiptun-ng只能解密使用TKIP加密的数据包,并不能快速计算出PMK或PSK。如果您对此感兴趣,可以去书店看一些关于哈希算法的书籍,也许您能够破解这些哈希算法。
在wpasupplicant套件中,有一个名为wpapassphrase的小工具,它的作用与airolib-ng类似,都是用来生成PMK。在BackTrack中,应该已经自带了这个工具。例如,如果有一个SSID为TP-LINK,PSK为12345678,那么生成PMK的方法是运行命令wpa_passphrase TP-LINK 12345678,结果应该如下所示:
network={
ssid=”TP-LINK”
#psk=”12345678″
psk=1eecc652f354863e9f985a96d48545c4994e0d21b04955432b60c2600c0743da
}
实际上,这就是PMK。通常,在电脑上运行查看无线密码的软件就可以得到这个PMK,然后将后面的字符串直接输入到无线客户端中,就可以连接到该SSID,相当于输入了12345678。生成PMK的过程是不可逆的,即无法通过这段代码逆推得到12345678。可以看到,即使PSK都是12345678,如果SSID名称改变,PMK也会发生改变,这就是为什么使用airolib-ng建立表时只能按照SSID生成的原因。