四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3571|回复: 0
打印 上一主题 下一主题

新浪微博登录密码加密函数 wsse加密算法说明

[复制链接]
  • TA的每日心情
    开心
    2018-12-28 16:25
  • 817

    主题

    1556

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14941
    跳转到指定楼层
    楼主
    发表于 2016-10-30 10:15:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    // 新浪微博登录密码加密函数  
    2.// password   密码明文  
    3.// servertime 提交的参数之一  
    4.// nonce      提交的参数之一  
    5.// encode_password 输出的加密后的16进制字符串,40个字符  
    6.// 返回 encode_password 的长度, 失败则返回0  
    7.  
    8.PASSENCODE_API int SinaSha1Encode(char *password, char *servertime, char *nonce, char *encode_password)  
    9.{  
    10.    if (encode_password)  
    11.    {  
    12.        encode_password[0]=NULL;  
    13.  
    14.        //定义要sha1的字符串  
    15.        char pTemp[400]={0};  
    16.        //定义返回的sha1值  
    17.        char szHash[41] ={0};  
    18.  
    19.        strcpy(pTemp,password);  
    20.        SHA1((unsigned char*)pTemp, szHash, 41);  
    21.  
    22.        strcpy(pTemp,szHash);  
    23.        SHA1((unsigned char*)pTemp, szHash, 41);  
    24.  
    25.        strcpy(pTemp,szHash);  
    26.        if (servertime) strcat(pTemp,servertime);  
    27.        if (nonce) strcat(pTemp,nonce);  
    28.  
    29.        SHA1((unsigned char*)pTemp, szHash, 41);  
    30.  
    31.        strcpy(encode_password,szHash);  
    32.  
    33.        return strlen(encode_password);  
    34.    }  
    35.  
    36.    return 0;  
    37.}  
    38.  
    39.//登陆伪代码  
    40.//***********************************************  
    41.ByteBuffer bytes;  
    42.  
    43.string url;  
    44.  
    45.string username="zhanghao@sina.com";  
    46.string password="mima";  
    47.string encode_password;  
    48.  
    49.url="http://login.sina.com.cn/sso/prelogin.php?&entry=sso&username=";  
    50.url+=username;  
    51.url+="&callback=parent.sinaSSOController.loginCallBack";  
    52.  
    53.BOOL bHtmlText;  
    54.BOOL bUTF8;  
    55.  
    56.string retcode;  
    57.string servertime;  
    58.string nonce;  
    59.  
    60.if (GetUrlData(url.c_str(),bytes,NULL,0,bHtmlText,bUTF8) && bytes.getLength() && bHtmlText)  
    61.{  
    62.    string str=bytes.c_str();  
    63.      
    64.    string::size_type pos(0),posend(0);  
    65.  
    66.    if( (pos=str.find("{",posend))!=string::npos && (posend=str.find("}", ++pos))!=string::npos )  
    67.    {  
    68.        string result=str.substr(pos,posend-pos);   
    69.  
    70.        replace_all(result,"\"","");  
    71.  
    72.        TRACE(result.c_str());  
    73.  
    74.        vector<string> vars;  
    75.        Split(result,vars,",");  
    76.        if (vars.size())  
    77.        {  
    78.  
    79.            for (int i=0;i<vars.size();i++)  
    80.            {  
    81.                vector<string> keys;  
    82.                Split(vars,keys,":");  
    83.  
    84.                if (keys.size()==2)  
    85.                {  
    86.  
    87.                    if (keys[0]=="retcode")  
    88.                    {  
    89.                        retcode=keys[1];  
    90.                    }else  
    91.                    if (keys[0]=="servertime")  
    92.                    {  
    93.                        servertime=keys[1];  
    94.                    }else  
    95.                    if (keys[0]=="nonce")  
    96.                    {  
    97.                        nonce=keys[1];  
    98.                    }else{  
    99.                        TRACE("key:%s val:%s",keys[0].c_str(),keys[1].c_str());  
    100.                    }  
    101.  
    102.                }  
    103.            }  
    104.  
    105.        }  
    106.         
    107.    }  
    108.}  
    109.  
    110.if (atoi(retcode.c_str())==0)  
    111.{  
    112.    EncodePasword(password,servertime,nonce,encode_password);  
    113.  
    114.    TRACE("servertime:%s",servertime.c_str());  
    115.    TRACE("nonce:%s",nonce.c_str());  
    116.    TRACE("encode_password:%s",encode_password.c_str());  
    117.  
    118.  
    119.    url="http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.12)";  
    120.  
    121.    string post;  
    122.  
    123./*  
    124.service=miniblog&client=ssologin.js%28v1.3.12%29&entry=miniblog&encoding=utf-  
    125.8&gateway=1&savestate=7&from=&useticket=1&username=diyiwl@sina.com&servertime=1306503150&nonce=IN4GY9&pwencode=wsse&password=74dd6f5f82e027412b6da345909f0df450b5f410&url=http%  
    126.3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&returntype=META&ssosimplelogin=1  
    127.*/  
    128.    post="service=miniblog&client=ssologin.js%28v1.3.12%29&entry=miniblog&encoding=GB2312&gateway=1&savestate=7&from=&useticket=1&username=";  
    129.    post+=username;  
    130.    post+="&servertime=";  
    131.    post+=servertime;  
    132.    post+="&nonce=";  
    133.    post+=nonce;  
    134.    post+="&pwencode=wsse&password=";  
    135.    post+=encode_password;  
    136.    post+="&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&returntype=META&ssosimplelogin=1";  
    137.  
    138.    TRACE(url.c_str());  
    139.    TRACE(post.c_str());  
    140.  
    141.    if (GetUrlData(url.c_str(),bytes,post.c_str(),post.length(),bHtmlText,bUTF8) && bytes.getLength() && bHtmlText)  
    142.    {  
    143.        TRACE(bytes.c_str());  
    144.    }  
    145.  
    146.}  
    147.//**********************************************  




    新浪网已经废弃了原来的那种简单的登录方法,可能是因为新浪微博。现在新浪使用的登录方法复杂程度不亚于腾讯。下面我们简单介绍新浪微博的登录 过程。     在登录之前我们需要先从新浪服务器获取两个变量:servertime,nonce。其中servertime中新浪的服务器时间,nonce是一 个随机生成的字符串。获取的需要通过这样一个网络接口:http://login.sina.com.cn/sso/pre ... nCallBack&user="+username+"&client=ssologin.js(v1.3.12)
    其中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

    example:

    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:1308647606&nonce8QJHE&pwencode:wsse&password:f435c677294851d13794359145e6f96826c1
    c3d2&url:http://www.baidu.com&returntype:META&ssosimplelogin:1
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-5-17 10:03 , Processed in 1.062500 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表