第一步:
当用户在浏览器输入:http://t.qq.com/login.php 的时候,浏览器下载页面,执行js检查用户是否qq登陆,如果QQ已经登陆的话,那么显示快速登陆界面,实现方式在ie为active object ,因为快速登陆和我们这次讨论的主题相关不大。所以不讨论。此步骤不影响输入用户名和密码的登陆方式。我们选择使用其他账号登陆。
第二步:
当用户输入QQ账号后,浏览器通过js向登陆服务器发送获取验证码的请求,如下图:
下面我们对请求进行分析:
请求的url是http://check.ptlogin2.qq.com/check 传递四个参数uin, appid , r ptlang
uin 用户的登陆账号即qq号码
appid 微博应用的id 相对于统一登陆来说微博也是一个应用
r 随机数,避免缓存
ptlang 用户语言代码
服务器response如下:
设置登陆ptvfsession 的cookie 在域 ptlogin2.qq.com
返回|Response 内容如上,其实上面是一个js函数调用,此函数三个参数,由登陆服务器设置好了,每次请求都会变化,这次为“0”,‘!ZGI’,和“\x00...”。这几个参数的作用在后面介绍。我们记着有这个几个参数即可。
第三步:
用户输入密码,点击登陆,请求过程如下:
分析如下:
请求的url: ptlogin2.qq.com/login 参数较多,我只找比较重要的说一说, u是QQ号码, p 是加密过的密码,verifycode 是验证码或者上一步骤服务器传递过来的参数,aid 是应用id 其他参数不太重要。
请求的cookie:带着上次得到的ptvsession
响应分析如下:
如果用户qq和密码正确的话,用户登录成功,响应的cookie值见上图,我勾选的skey和lkey是用户登录的凭证,有此cookie说明用户已经登录成功。 响应的代码如下:
这同样也是一个js函数。通过文字我们可以判断用户登录成功了。
至此,用户登录完毕。skey 和lkey 的cookie种在了qq.com域名下。所以用户可以在腾讯的各个子站之间漫游,不需要重新登录了。。
大致流程我概括如下:
1,通过用户名称得到vercode
2, 使用vercodemd5 加密密码 之后完成登录。
对登录过程了解之后,就可以使用使用用户名和密码用httpClient或者其他工具来模拟登录了,其中难点是密码的加密算法。算法并不是对用户输入的密码做简单的md5散列,我们下面对密码加密算法进行分析。
二,密码是如何加密的
登录使用的js是 login_div.js?1.2.1,下载之后结果如下图:
注意我勾选的ptui_checkVC(B,E,C),是不是感觉很熟悉,对,就是上面第一步中check之后返回的js函数。此js加载之后,首先执行pt.init()初始化函数。具体代码可以仔细分析。我先说重要部分,让我们使用上面的参数“0”,‘!ZGI’,和“\x00...” 进入 ptui_checkVC内部:此函数调用其实是:pt.checkVC(B, E, C);
再进入pt.checkVC内部: 具体看下面代码,注意我勾选的两个句子:pt.uin= "\x00..."
当用户点击登录按钮之后,执行的js其实是pt.submit() 代码如下:
我勾选的那端代码就是对密码的加密过程,让我们一句一句的分析:
var D = G.p.value; //得到密码的值
var H = hexchar2bin(md5(D)); // 进行一次md5加密,之后转换为字符串
var F = md5(H + pt.uin); // 用上一步的结果和 pt.uin 链接再进行一次md5加密,
var C = md5(F + G.verifycode.value.toUpperCase()); // 用上一步的结果和verifycode 大写 链接再进行一次md5加密
加密完成了。。
后记:
有了这个分析过程,我们可以使用任何语言来实现腾讯网站的登陆了。。。。。。