rsa加密算法python_模拟新浪微博登录(Python+RSA加密算法)
聲明:
由于本人使用用的是Python語言,以下內容就在該語言下進行解釋說明。有使用Java語言的可以參考IT男雜記(http://marspring.mobi/http-client-weibo/)
正文:
PC登錄新浪微博時,在客戶端用js預先對用戶名、密碼都進行了加密,而且在POST之前會GET一組參數,這也將作為POST_DATA的一部分。這樣,就不能用通常的那種簡單方法來模擬POST登錄(比如人人網)。
通過爬蟲獲取新浪微博數據,模擬登錄是必不可少的。
1、在提交POST請求之前,需要GET獲取四個參數(servertime,nonce,pubkey和rsakv),不是之前提到的只是獲取簡單的servertime,nonce,這里主要是由于js對用戶名、密碼加密方式改變了。
1.1 由于加密方式的改變,我們這里將使用到RSA模塊,有關RSA公鑰加密算法的介紹可以參考網絡中的有關內容。下載并安裝rsa模塊:
根據自己的Python版本選擇適合自己的rsa安裝包(.egg),在win下安裝需要通過命令行使用easy_install.exe(win上安裝setuptool從這里下載:setuptools-0.6c11.win32-py2.6.exe?安裝文件?)進行安裝,例如:easy_install rsa-3.1.1-py2.6.egg,最終命令行下測試import rsa,未報錯則安裝成功。
1.2 獲得以及查看新浪微博登錄js文件
1.3 登錄
登錄第一步,添加自己的用戶名(username),請求prelogin_url鏈接地址:
prelogin_url?=?'http://login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)'?%?username
使用get方法得到以下類似內容:
sinaSSOController.preloginCallBack({"retcode":0,"servertime":1362041092,"pcid":"gz-6664c3dea2bfdaa3c94e8734c9ec2c9e6a1f","nonce":"IRYP4N","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":1})
進而從中提取到我們想要的servertime,nonce,pubkey和rsakv。當然,pubkey和rsakv的值我們可以寫死在代碼中,它們是固定值。
2、之前username?經過BASE64計算:
1 username_ =urllib.quote(username)2 username = base64.encodestring(username)[:-1]
password經過三次SHA1加密,且其中加入了 servertime 和 nonce 的值來干擾。即:兩次SHA1加密后,結果加上servertime和nonce的值,再SHA1算一次。
在最新的rsa加密方法中,username還是以前一樣的處理;
password加密方式和原來有所不同:
2.1 先創建一個rsa公鑰,公鑰的兩個參數新浪微博都給了固定值,不過給的都是16進制的字符串,第一個是登錄第一步中的pubkey,第二個是js加密文件中的‘10001’。
這兩個值需要先從16進制轉換成10進制,不過也可以寫死在代碼里。這里就把10001直接寫死為65537。代碼如下:
1 rsaPublickey = int(pubkey, 16)2 key = rsa.PublicKey(rsaPublickey, 65537) #創建公鑰
3 message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到
4 passwd = rsa.encrypt(message, key) #加密
5 passwd = binascii.b2a_hex(passwd) #將加密信息轉換為16進制。
2.2 請求通行證url:login_url?=‘http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)’
需要發送的報頭信息
1 postPara ={2 'entry': 'weibo',3 'gateway': '1',4 'from': '',5 'savestate': '7',6 'userticket': '1',7 'ssosimplelogin': '1',8 'vsnf': '1',9 'vsnval': '',10 'su': encodedUserName,11 'service': 'miniblog',12 'servertime': serverTime,13 'nonce': nonce,14 'pwencode': 'rsa2',15 'sp': encodedPassWord,16 'encoding': 'UTF-8',17 'prelt': '115',18 'rsakv': rsakv,19 'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',20 'returntype': 'META'
21 }
請求的內容中添加了rsakv,將pwencode的值修改為rsa2,其他跟以前一致。
如果retcode=101則表示登錄失敗。登錄成功后結果與之類似,不過retcode的值是0。
3、登錄成功后,在body中的replace信息中的url就是我們下一步要使用的url。然后對上面的url使用GET方法來向服務器發請求,保存這次請求的Cookie信息,就是我們需要的登錄Cookie了。
總結
以上是生活随笔為你收集整理的rsa加密算法python_模拟新浪微博登录(Python+RSA加密算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: “早寒逼晚岁”下一句是什么
- 下一篇: 养老保险一个月多少钱啊?
