當前位置:成語大全網 - 書法字典 - 如何用python模擬JS中jsEncrypt模塊的加密方式?

如何用python模擬JS中jsEncrypt模塊的加密方式?

PC登錄新浪微博時,用戶名和密碼在客戶端都是事先用js加密的,POST之前會得到壹組參數,這些參數也會是POST_DATA的壹部分。這樣就不能用通常的簡單方法來模擬POST登錄(比如人人網)。

通過爬蟲獲取新浪微博數據,模擬登錄,必不可少。

1.在提交POST請求之前,需要獲取四個參數(servertime、nonce、pubkey和rsakv),而不是之前說的只獲取簡單的servertime和nonce,主要是因為js改變了用戶名和密碼的加密方式。

1.1由於加密方式的改變,這裏我們將使用RSA模塊。關於RSA公鑰加密算法的介紹,請參考網絡中的相關內容。下載並安裝rsa模塊:

下載:/signup/signin.php)源代碼,在裏面可以找到js /js/sso/ssologin.js的地址,但是裏面的內容打開後是加密的,可以找壹個在線解密網站解密,查看最終用戶名和密碼的加密方法。

1.3登錄

登錄的第壹步是添加自己的用戶名(username)並請求prelogin_url的鏈接地址:

prelog in _ URL = '/SSO/prelog in . PHP?entry = sso & ampcallback = sinassocontroller . prelogincallback & amp;蘇= % s & amprsakt = mod & ampclient = ssologin . js(v 1 . 4 . 4)% username

使用get方法獲取類似於以下內容的內容:

sinassocontroller . prelogincallback({ " retcode ":0," server time ":1362041092," pcid ":" gz-6664 c 3d ea 2 bfda a3 c 94 e 8734 c 9 e 2c 9 E6 a 1f "," nonce":"IRYP4N "," pubkey ":" eb2a 3856861887 fa 180 BD

然後我們可以提取我們想要的servertime、nonce、pubkey和rsakv。當然,pubkey和rsakv的值可以寫在代碼中,它們是固定值。

2.以前,用戶名是由BASE64計算的:

復制代碼代碼如下:

用戶名_ = urllib.quote(用戶名)

username = base64 . encode string(username)[:-1]

密碼采用SHA1三次加密,並加入servertime和nonce的值進行幹擾。即SHA1加密兩次後,結果加上servertime和nonce的值,然後再計算SHA1。

在最新的rsa加密方法中,用戶名仍然像以前壹樣處理;

密碼加密方法與原來不同:

2.1首先創建壹個rsa公鑰,公鑰的兩個參數都是新浪微博給定的固定值,但是所有的字符串都是十六進制的16。第壹個是第壹次登錄步驟中的pubkey,第二個是js加密文件中的' 10001 '。

這兩個值需要從16轉換到10,但也可以寫在代碼中。這裏把10001直接寫成65537。代碼如下:

復制代碼代碼如下:

rsaPublickey = int(pubkey,16)

Key = rsa.publickey (rsapublickey,65537) #創建壹個公鑰。

message = str(server time)+' \ t '+str(nonce)+' \ n '+str(password)#通過拼接明文js加密文件得到。

Passwd = rsa.encrypt(消息,密鑰)#加密

passwd = bin ascii . b2a _ hex(passwd)#將加密信息轉換為16 base。

2.2請求傳遞的URL:log in _ URL = '/SSO/log in . PHP?' client = SSO log in . js(v 1 . 4 . 4)'

要發送的標題信息

復制代碼代碼如下:

postPara = {

條目':'微博',

網關':' 1 ',

來自“:”,

保存狀態':' 7 ',

用戶票證':' 1 ',

ssosimplelogin': '1 ',

vsnf': '1 ',

vsnval“:”,

' su ':編碼用戶名,

服務':'迷妳博客',

'服務器時間':服務器時間,

'現時':現時,

pwencode': 'rsa2 ',

sp': encodedPassWord,

編碼':' UTF-8 ',

預測試':' 115 ',

' rsakv' : rsakv,

url': '/ajaxlogin.php?framelogin = 1 & amp;callback = parent . sinassocontroller . feedback URL callback ',

returntype': 'META '

}

Rsakv添加到請求中,pwencode的值更改為rsa2,否則與之前相同。

組織參數,發布請求。要查看登錄是否成功,可以參考句子位置。替換("/ajaxlog.php?framelogin = 1 & amp;回調= parent . sinassocontroller . feedback URL callback & amp;retcode=101。reason = % B5 % C7 % C2 % BC % C3 % FB % BB % F2 % C3 % DC % C2 % EB % B4 % ED % CE % F3 ");

如果retcode=101,則登錄失敗。成功登錄後,結果類似,但retcode的值為0。

3.成功登錄後,正文中替換信息中的url就是我們接下來要使用的url。然後用GET方法向服務器發送對上述url的請求,保存這個請求的Cookie信息,就是我們需要的登錄Cookie。