新浪微博登录密码加密函数 wsse加密算法说明
- // 新浪微博登录密码加密函数
- // password 密码明文
- // servertime 提交的参数之一
- // nonce 提交的参数之一
- // encode_password 输出的加密后的16进制字符串,40个字符
- // 返回 encode_password 的长度, 失败则返回0
- PASSENCODE_API int SinaSha1Encode(char *password, char *servertime, char *nonce, char *encode_password)
- {
- if (encode_password)
- {
- encode_password[0]=NULL;
- //定义要sha1的字符串
- char pTemp[400]={0};
- //定义返回的sha1值
- char szHash[41] ={0};
- strcpy(pTemp,password);
- SHA1((unsigned char*)pTemp, szHash, 41);
- strcpy(pTemp,szHash);
- SHA1((unsigned char*)pTemp, szHash, 41);
- strcpy(pTemp,szHash);
- if (servertime) strcat(pTemp,servertime);
- if (nonce) strcat(pTemp,nonce);
- SHA1((unsigned char*)pTemp, szHash, 41);
- strcpy(encode_password,szHash);
- return strlen(encode_password);
- }
- return 0;
- }
- //登陆伪代码
- //***********************************************
- ByteBuffer bytes;
- string url;
- string username="zhanghao@sina.com";
- string password="mima";
- string encode_password;
- url="http://login.sina.com.cn/sso/prelogin.php?&entry=sso&username=";
- url+=username;
- url+="&callback=parent.sinaSSOController.loginCallBack";
- BOOL bHtmlText;
- BOOL bUTF8;
- string retcode;
- string servertime;
- string nonce;
- if (GetUrlData(url.c_str(),bytes,NULL,0,bHtmlText,bUTF8) && bytes.getLength() && bHtmlText)
- {
- string str=bytes.c_str();
- string::size_type pos(0),posend(0);
- if( (pos=str.find("{",posend))!=string::npos && (posend=str.find("}", ++pos))!=string::npos )
- {
- string result=str.substr(pos,posend-pos);
- replace_all(result,"\"","");
- TRACE(result.c_str());
- vector<string> vars;
- Split(result,vars,",");
- if (vars.size())
- {
- for (int i=0;i<vars.size();i++)
- {
- vector<string> keys;
- Split(vars[i],keys,":");
- if (keys.size()==2)
- {
- if (keys[0]=="retcode")
- {
- retcode=keys[1];
- }else
- if (keys[0]=="servertime")
- {
- servertime=keys[1];
- }else
- if (keys[0]=="nonce")
- {
- nonce=keys[1];
- }else{
- TRACE("key:%s val:%s",keys[0].c_str(),keys[1].c_str());
- }
- }
- }
- }
- }
- }
- if (atoi(retcode.c_str())==0)
- {
- EncodePasword(password,servertime,nonce,encode_password);
- TRACE("servertime:%s",servertime.c_str());
- TRACE("nonce:%s",nonce.c_str());
- TRACE("encode_password:%s",encode_password.c_str());
- url="http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.12)";
- string post;
- /*
- service=miniblog&client=ssologin.js%28v1.3.12%29&entry=miniblog&encoding=utf-
- 8&gateway=1&savestate=7&from=&useticket=1&username=diyiwl@sina.com&servertime=1306503150&nonce=IN4GY9&pwencode=wsse&password=74dd6f5f82e027412b6da345909f0df450b5f410&url=http%
- 3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&returntype=META&ssosimplelogin=1
- */
- post="service=miniblog&client=ssologin.js%28v1.3.12%29&entry=miniblog&encoding=GB2312&gateway=1&savestate=7&from=&useticket=1&username=";
- post+=username;
- post+="&servertime=";
- post+=servertime;
- post+="&nonce=";
- post+=nonce;
- post+="&pwencode=wsse&password=";
- post+=encode_password;
- post+="&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&returntype=META&ssosimplelogin=1";
- TRACE(url.c_str());
- TRACE(post.c_str());
- if (GetUrlData(url.c_str(),bytes,post.c_str(),post.length(),bHtmlText,bUTF8) && bytes.getLength() && bHtmlText)
- {
- TRACE(bytes.c_str());
- }
- }
- //**********************************************
新浪网已经废弃了原来的那种简单的登录方法,可能是因为新浪微博。现在新浪使用的登录方法复杂程度不亚于腾讯。下面我们简单介绍新浪微博的登录 过程。 在登录之前我们需要先从新浪服务器获取两个变量:servertime,nonce。其中servertime中新浪的服务器时间,nonce是一 个随机生成的字符串。获取的需要通过这样一个网络接口:http://login.sina.com.cn/sso/prelogin.php?entry=miniblog&callback=sinaSSOController.preloginCallBack&user="+username+"&client=ssologin.js(v1.3.12)
其中username是你的用户名。
获取到我们需要的内容后,接下来就是加密的过程了。加密使用的是通用的SHA1加密算法:
其中username是你的用户名。
获取到我们需要的内容后,接下来就是加密的过程了。加密使用的是通用的SHA1加密算法:
- 把密码进行一次SHA1加密,结果再进行一次SHA1加密
- 把经过两次SHA1加密的结果附上servertime,nonce再进行一次SHA1加密
- 加密的结果作为登录密码
登录地址没有变,仍使用:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.12)
但参数要复杂一点了:
service:选择服务,我们这里使用的新浪微博:miniblog
client:ssologin.js%28v1.3.12%29
entry:miniblog
encoding:utf-8
gateway:1
savestate:0
useticket:1,这里使用到了登录票据。
username:你的用户名
servertime:上步得到的服务器时间
nonce:上步得到的随机字符串
pwencode:wsse(没整明白是个什么东西,不过从来不变)
password:加密后的密码
url:一个回调地址
returntype:META(使用中没有发生变化)
ssosimplelogin:1
但参数要复杂一点了:
service:选择服务,我们这里使用的新浪微博:miniblog
client:ssologin.js%28v1.3.12%29
entry:miniblog
encoding:utf-8
gateway:1
savestate:0
useticket:1,这里使用到了登录票据。
username:你的用户名
servertime:上步得到的服务器时间
nonce:上步得到的随机字符串
pwencode:wsse(没整明白是个什么东西,不过从来不变)
password:加密后的密码
url:一个回调地址
returntype:META(使用中没有发生变化)
ssosimplelogin:1
example:
8&gateway:1&savestate:0&useticket:1&username: 用户 名&servertime:1308647606&nonce:L8QJHE&pwencode:wsse&password:f435c677294851d13794359145e6f96826c1
c3d2&url:http://www.baidu.com&returntype:META&ssosimplelogin:1