我的多名QQ好友以及QQ群中的多名群友,都出现过QQ账号被盗用却密码没有被修改的情况,然后只要自己再改下密码,也就在危机之下保住了自己的QQ账号。这算是比较幸运的事情了,但是于此背后我尝试思考这是为什么呢。也许是是盗号者良心发现吧(自我安慰罢了~~~~(>_<)~~~~ ),也许是他们只需要临时使用我们的密码等等,在此且先不考虑这些原因,而就从技术角度来分析一下出现这种情况的可能性。
我的猜测是:那些盗号者没法修改我们的密码。腾讯对我们的密码进行了不可逆算法的处理(如MD5),数据库中是保存了不可逆处理后的值,当登录的时候是在客户端就对密码进行不可逆处理,发送给服务器的是一个处理后的值,还有保存密码那个功能,保存的也是处理后的值;而当需要修改密码的时候,会将我们输入的原密码直接发送给服务器,然后在服务器进行不可逆处理。为了探究自己的猜测是否正确,也是出于好奇,尝试探究一下腾讯的API,不过由于本人能力有限,未能完全证明以上的猜测,不过也通过查阅一款早期的手机QQAPI的资料证实了当我们登录时,的确是在客户端就对密码进行了不可逆处理,用的是MD5散列算法,最终保存起来的是我们密码的MD5值(一个32位的16进制数)。
由于MD5是一种不可逆的散列算法(又称之为指纹算法或摘要算法),是无法逆向破解的,就像是可以由我们每个人得到我们的指纹,却不能由指纹来得到我们整个人的信息。所以,就算是腾讯公司,也是不知道我们设置的QQ密码是什么,也是因为如此,很多网站的找回密码功能,都只是给我们一个新的密码,而并不是原密码。
说到这里,那些盗号者很可能就是盗取了我们密码的MD5值,而他们却无法获取我们的原密码。由于登录是需要发送MD5值给服务器,所以他们能登录,但是修改密码必须把我们的原密码发送给服务器,所以他们没法修改了。也许他们是利用了腾讯数据库的漏洞而从中盗取,但这可能性不大,毕竟腾讯不是吃素的,更可能的是从我们电脑上盗取,因为我们有保存密码这个功能,这项功能是为了方便我们用户,但与此同时也带来了安全问题,既然电脑上存了我们的密码,就有被盗取的可能性。于是对保存的密码进行MD5处理,哪怕被盗,盗号者也只能登录,而无法篡改我们的密码,使得危害性大大降低。
也许有人会怀疑是否真的无法从MD5值逆向得到原值,这个我也不能证明,但这是经过很多专门从事加密算法的那些专家研究证明的不可逆算法。网上很多的MD5破解工具,或者MD5破解网站,其实是暴力破解,或者用穷举法。但这种方法只能计算出非常简单的MD5值(原值可能就只有三四个字符或者更短的那种),想把所有的MD5值都计算一遍那是不可行的,就拿我的I5 CPU来说,要把所有的MD5值都算一遍,从宇宙诞生算到现在也算不完。也许有人听说山东大学有个博士研究出了破解MD5的方法,但其实那也不是逆向破解,而是提高碰撞的概率,使得暴力破解所需要的时间大大降低。可即便如此,也不可能在一瞬间就计算出来,毕竟我们人是活的,还会采去其它的措施(如加盐处理)去防止暴力破解,退一万步说,通过使用MD5总会比不使用要安全得多。总的来说MD5算法还是很有价值的,去年我研究过支付宝的API,发现支付宝的接口所传递的数据就是通过MD5处理以此来保证安全性,所以可见它的价值了。