前段时间有空,分析了一下新浪微博登陆验证,结合几篇文章摸了一些门道,但是最近比较忙,没时间继续深究,就写一下分析的过程和结果,,供新手朋友参考.大神请无视我.
关于新浪SSO单点登录的技术实现之类的,请自行脑补,以我的水平也无法深入浅出的讲明白.我只说过程和结果.
首先我们打开Fiddler并监视浏览器进程 .浏览器打开微博登陆页面 http://weibo.com/ 这时候就能看到捕获了很多数据
注意看 /sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.5)&_=1363856505579 HTTP/1.1 这条数据 这里是向服务器发送预登陆信息.
这个预登陆信息是什么时候发送的呢?是在这个对话框
失去焦点的时候发送的.
假设我们的登录用户名是test 那么我们在fiddler中用表格方式查看 就发现这条数据是向预登陆服务器发送了如下的信息
其中要注意的就是su值,它是由用户名 test经过base64加密后得到的值。
发送预登陆信息后,服务器会返回类似于这样的信息
sinaSSOController.preloginCallBack({"retcode":0,"servertime":1360031246,"pcid":"gz-6a6b1dda0c43601d5b952698b281a274b755","nonce":"5921EV","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","showpin":0,"exectime":7})
这里 servertime是服务器返回来的时间
nonce我不知道是什么东西,但是接下来要用到。
pubkey是作为密码RSA加密的公钥
那么我们接着在用户名和密码处输入正确的值,然后点击登录新浪微博的按钮。fiddler会监控到浏览器发送了类似于这样的值
POST /sso/login.php?client=ssologin.js(v1.4.5) HTTP/1.1 浏览器以post方式发送以下数据
entry=weibo&gateway=1&from=&savestate=0&useticket=1&pagerefer=&vsnf=1&su=aXQyMDA3emh1bGlu&service=miniblog&servertime=1363857433&nonce=6HO1P5&pwencode=rsa2&rsakv=1330428213&sp=b26ef2b88b003b1ff962c287ede158c209e64b19dd9b5e2ae52fb21cb6fa703f7c961ac006ea8dec5add4a2a937adca7b7888cfeaf57ee0c578d6e25fb55fff828ce5d5af55ca739e49796441ee41fbea65da7d90e7c7e64f4af3cea9dfe9ecb10c007358d32577634ffb20cf158a60f07a697da5a08125a8b4b3db358a63947&encoding=UTF-8&prelt=1581&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&returntype=META
这里面有很多属性的值是不变的可以直接套用,比如useticket gateway等,有些是需要改变的。
su是base64加密后的用户名
servertime是预登陆时候返回来的服务器时间
nonce是预登陆返回来的数值
其他的都没什么好说的 ,只是这个sp的值要说一下,这个sp就是加密后的登录密码。
密码的加密是在本地通过一个js完成的,这个js的名字一直 ssologin.js的内容,我去除了无关的js脚本,只留下了密码加密函数,加密的函数需要用到的参数就有服务器时间,nonce,预登陆返回的公钥。
大概是这样
写了一个测试的html来查看计算得到的密码值。和发送的实际密码比。
这里就基本上都能得到要向登录服务器发送的值了。但是我现在存在一个问题,就是新浪登录时候js的RSA加密函数,如何在C#的Winform中调用js函数,
一开始用了网上流传webBrowser方式,失败,DotNetScriptEngine,失败,微软自带的一个js解释dll,失败。人生太悲催了。无奈之下用谷歌v8引擎,。最后也是编译时候各种烦恼。最后放弃。人品太差。。
/****************/
Witch_Soya 2013年3月21日17:41:34
/***************/