Skip to content

Latest commit

 

History

History
35 lines (21 loc) · 1.26 KB

2016-08-05-http下是否有加密登陆密码的必要.md

File metadata and controls

35 lines (21 loc) · 1.26 KB

本文Copy https://segmentfault.com/q/1010000000926027

QQ 网页上的登陆模块(全程HTTP/GET请求)


QQ 在登陆时,对用户输入的密码加密的JS代码为:

    function getEncryption(password, uin, vcode, isMd5) {
        var str1 = hexchar2bin(isMd5 ? password : md5(password));
        var str2 = md5(str1 + uin);
        var str3 = md5(str2 + vcode.toUpperCase());
        return str3
    }

白话就是:

md5(md5(md5(密码) + 用户的QQ号) + 验证码)

验证码是一次性的, 所以,在你在网络层拿到本次的请求之后,无法做 重放攻击, 因为验证码是不正确的.

而当你获取新的验证码, 但你并不知道 组合之前的内容[md5(md5(密码) + 用户的QQ号)] 是什么 , 所以你无法重新发送本次请求实现登陆的目的.

32位MD5 + 4位验证码 总计 36位的字符串, 你去破解吧. 估计等你挂了你也破解不出来.

至于 服务端的校验, 只要将记录下来的MD5值(而不是记录的明文), 进行同样的运算, 得到的结果与提交上来的一样, 即密码正确.

验证码的内容是服务器下发的,而且是一次性的,所以 客户端无法伪造, 也无法重用.