【1】背景介绍
新浪微博之前模拟登录的密码加密方式是用SHA1的加密方式,近期做了密码加密方式的修改,
采用Rsa1密码加密方式。
【2】模拟登录的流程介绍
(1)首先登录的用户名必须要做一些处理,【nd@163.com】的【@】必须替换成【%40】,否则模拟登录加密方式是出错
(2)对(1)处理过的用户名进行Base64编码处理
(3)获取登录需要的参数,其中 su为(2)步骤中处理过的username
http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=userName&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.11)&_=1381666973790
(4)通过步骤(3)可以得到下面的json串,其中retcode=0,表示获取成功,解析出其中的servertime、nonce、pubkey、rsakv四个参数.
"sinaSSOController.preloginCallBack({\"retcode\":0,\"servertime\":1381650591,\"pcid\":\"xd-9de19783c86f8bae0cec1039155e478ebeb7\",\"nonce\":\"H3NZLR\",\"pubkey\":\"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443\",\"rsakv\":\"1330428213\",\"exectime\":1})"
(5)获取新浪脚本的加密密码,
通过.net直接执行新浪js的加密方式获取加密后的密码
using Roslyn.Scripting;
using Roslyn.Scripting.CSharp;
加载本地的js文件【详细js见附件】
ScriptEngine se = new ScriptEngine(ScriptLanguage.JavaScript);
object obj = se.Run("getpass", new object[] { pwd, servicetime, nonce, pubkey }, js);
return obj.ToString();
(6)根据(5)得到的参数sp,和servertime、nonce、pubkey、rsakv,su等参数 通过【post】请求登录地址
http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)
(7)返回结果中,如果retcode=0即,表示登录成功,101表示登录失败,成功后就可以把cookie记录下来,
可以访问新浪微博其他需要登录状态下访问的数据
<html>
<head>
<title>新浪通行证</title>
<meta http-equiv="refresh" content="0; url='http://weibo.com/sso/login.php?url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=ST-MzQ5NTgyOTgwMQ==-1381665939-xd-06D3C001B849033EB4FE7B8715E8FA65&retcode=0'"/>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
</head>
<body bgcolor="#ffffff" text="#000000" link="#0000cc" vlink="#551a8b" alink="#ff0000">
<script type="text/javascript" language="javascript">
location.replace("http://weibo.com/sso/login.php?url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=ST-MzQ5NTgyOTgwMQ==-1381665939-xd-06D3C001B849033EB4FE7B8715E8FA65&retcode=0");
</script>
</body>
</html>
新浪微博之前模拟登录的密码加密方式是用SHA1的加密方式,近期做了密码加密方式的修改,
采用Rsa1密码加密方式。
【2】模拟登录的流程介绍
(1)首先登录的用户名必须要做一些处理,【nd@163.com】的【@】必须替换成【%40】,否则模拟登录加密方式是出错
(2)对(1)处理过的用户名进行Base64编码处理
(3)获取登录需要的参数,其中 su为(2)步骤中处理过的username
http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=userName&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.11)&_=1381666973790
(4)通过步骤(3)可以得到下面的json串,其中retcode=0,表示获取成功,解析出其中的servertime、nonce、pubkey、rsakv四个参数.
"sinaSSOController.preloginCallBack({\"retcode\":0,\"servertime\":1381650591,\"pcid\":\"xd-9de19783c86f8bae0cec1039155e478ebeb7\",\"nonce\":\"H3NZLR\",\"pubkey\":\"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443\",\"rsakv\":\"1330428213\",\"exectime\":1})"
(5)获取新浪脚本的加密密码,
通过.net直接执行新浪js的加密方式获取加密后的密码
using Roslyn.Scripting;
using Roslyn.Scripting.CSharp;
加载本地的js文件【详细js见附件】
ScriptEngine se = new ScriptEngine(ScriptLanguage.JavaScript);
object obj = se.Run("getpass", new object[] { pwd, servicetime, nonce, pubkey }, js);
return obj.ToString();
(6)根据(5)得到的参数sp,和servertime、nonce、pubkey、rsakv,su等参数 通过【post】请求登录地址
http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)
(7)返回结果中,如果retcode=0即,表示登录成功,101表示登录失败,成功后就可以把cookie记录下来,
可以访问新浪微博其他需要登录状态下访问的数据
<html>
<head>
<title>新浪通行证</title>
<meta http-equiv="refresh" content="0; url='http://weibo.com/sso/login.php?url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=ST-MzQ5NTgyOTgwMQ==-1381665939-xd-06D3C001B849033EB4FE7B8715E8FA65&retcode=0'"/>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
</head>
<body bgcolor="#ffffff" text="#000000" link="#0000cc" vlink="#551a8b" alink="#ff0000">
<script type="text/javascript" language="javascript">
location.replace("http://weibo.com/sso/login.php?url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=ST-MzQ5NTgyOTgwMQ==-1381665939-xd-06D3C001B849033EB4FE7B8715E8FA65&retcode=0");
</script>
</body>
</html>