python RSA加密解密及模擬登陸cnblog

  一、公開密鑰加密javascript

  又稱非對稱加密,須要一對密鑰,一個是私人密鑰,另外一個則是公開密鑰。公鑰加密的只能私鑰解密,用於加密客戶上傳數據。私鑰加密的數據,公鑰能夠解密,主要用於數字簽名。詳細介紹可參見維基百科html

  二、RSA加密算法java

  RSA加密屬於非對稱加密。RSA算法基於一個十分簡單的數論事實:將兩個大質數相乘十分容易,可是想要對其乘積進行因式分解卻極其困難,所以能夠將乘積公開做爲加密密鑰。維基百科中對RSA算法的安全性進行說明:RSA加密算法python

  「對極大整數作因式分解的難度決定了RSA算法的可靠性。換言之,對一極大整數作因數分解愈困難,RSA算法愈可靠。假若有人找到一種快速因數分解的算法的話,那麼用RSA加密的信息的可靠性就確定會極度降低。但找到這樣的算法的可能性是很是小的。今天只有短的RSA鑰匙纔可能被強力方式解破。到目前爲止,世界上尚未任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息其實是不能被解破的。」web

  RSA的加密算法能夠參考:RSA算法原理(一)RSA算法原理(二)算法

  三、python進行RSA加密解密json

  

#生成rsa密鑰
from Crypto.PublicKey import RSA
rsa_obj = RSA.generate(1024)
private_pem = rsa_obj.exportKey() #pem格式輸出私鑰
public_key = rsa_obj.publickey()
public_pem = public_key.exportKey() #將公鑰輸出成pem格式
print public_pem

#結果相似下面這樣
'''
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8jxUVKHjb0kSYRMObVDv20IyN
A1AQS2+oHGB5LNLV+cdMttldWOZwnbHYZrYa4L/MtQhQR4e5JOZhSQe14j2RAWy+
99uXEa88upt3rpAFOjpRcN9larUPXO4yF/5KXI5eo5H2Src+K6Gu+1D1PW411Rqq
d/Uzw8zfx8q5gaH6HwIDAQAB
-----END PUBLIC KEY-----
'''

from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
#rsa加密,一般對加密結果進行base64編碼
def encrypt(public_key, message):
    cipher = Cipher_pkcs1_v1_5.new(public_key)
    cipher_text = base64.b64encode(cipher.encrypt(message))
    return cipher_text


#rsa解密
def decrypt(rsakey, encrypt_text):
    cipher = Cipher_pkcs1_v1_5.new(rsakey)
    return cipher.decrypt(base64.b64decode(encrypt_text), '')

msg = 'hello world'
encrypt_text = encrypt(public_key, msg)
print encrypt_text

'''
goWbZ961d34RdEEgvJJtATAcAxXiY6QFTi7ToSmXQEyEKcHTNLqDdkzt3Iqwkhtfro4xCpLm4g+XqSQRNNN+3uQ9/Fahk6TZmi9eRcte5fU72jwyK6ybOAln8Chl8h14bjIsOAahmp9nuYdEFi7tV4ydNE75KMuAcHGlsJYTNjU=
'''

text = decrypt(rsa_obj, encrypt_text)
print text
'hello world'

 

  四、模擬登陸cnblog安全

  訪問登陸頁面,https://passport.cnblogs.com/user/signin,輸入用戶名密碼,查看登陸信息,發現用戶名密碼被加密了cookie

  看了下源代碼,發現以下信息session

 

  咱們發現用戶名密碼被rsa加密了,沒有私鑰信息,是沒法解密其中的內容。其次還有VerificationToken字段。咱們能夠對用戶名密碼進行rsa加密,而後模擬登陸。代碼以下:

#從登陸頁獲取public key,須要手動進行格式化處理
pub = '\n'.join([
'-----BEGIN PUBLIC KEY-----',
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0M',
'ccuMeXCHgVlGOoYyFwLdS24Im2e7YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdg',
'OQT6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvXH0zDKfi02prknr',
'ScAKC0XhadTHT3Al0QIDAQAB',
'-----END PUBLIC KEY-----'
])

#導入公鑰
public_key = RSA.importKey(pub)

input1 = encrypt(public_key,'****') #用戶名
input2 = encrypt(public_key,"****") #密碼

#登陸的信息是保存在cookies中,須要cookeis驗證
#使用requests的session,能夠自動幫咱們處理cookies
s = requests.Session()
headers = {
# 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
# 'Accept-Encoding':'gzip, deflate, sdch, br',
# 'Accept-Language':'zh-CN,zh;q=0.8',
# 'Connection':'keep-alive',
'Host':'passport.cnblogs.com',
'Upgrade-Insecure-Requests':1,
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
}

#打開登陸頁
r = s.get('https://passport.cnblogs.com/user/signin', headers=headers)
import re
#獲取VerificationToken
token = re.search(r"'VerificationToken': '(.*?)'", r.text)
token = token.group(1)
headers = {
# 'Accept':'application/json, text/javascript, */*; q=0.01',
# 'Accept-Encoding':'gzip, deflate, br',
# 'Accept-Language':'zh-CN,zh;q=0.8',
# 'Connection':'keep-alive',
'Content-Type':'application/json; charset=UTF-8',
'Host':'passport.cnblogs.com',
'Origin':'https://passport.cnblogs.com',
'Referer':'https://passport.cnblogs.com/user/signin',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
'VerificationToken': token,
'X-Requested-With':'XMLHttpRequest' #這是必須的
}

data = {'input1':input1, 'input2':input2, "remember": True}
r = s.post('https://passport.cnblogs.com/user/signin', data = json.dumps(data), headers=headers)

headers = {
# 'Accept':'text/plain, */*; q=0.01',
# 'Accept-Encoding':'gzip, deflate, br',
# 'Accept-Language':'zh-CN,zh;q=0.8',
# 'Connection':'keep-alive',
'Host':'home.cnblogs.com',
'Referer':'https://home.cnblogs.com/',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
'X-Requested-With':'XMLHttpRequest'
}

#獲取當前用戶信息,驗證是否登陸成功
print s.get('https://home.cnblogs.com/user/CurrentUserInfo', headers=headers).text


'''
<h1 id="header_user_left">
        歡迎你,lwli
</h1>
<div id="header_user_right">
        <a href="/u/lilinwei340/"><img class="pfs" src="//pic.cnblogs.com/face/sample_face.gif" alt=""/></a>
        <a href="/u/lilinwei340/">lwli</a>
            · <a href="http://www.cnblogs.com/lilinwei340/">個人博客</a>
        · <a href="//home.cnblogs.com/set/account/">設置</a>
        · <a href="javascript:void;" onclick="return logout();">退出</a>
</div>
'''

 

  能夠看到模擬登陸成功了。若是僅僅爲了模擬登陸,不用這麼麻煩,能夠考慮:

  一、不須要本身去進行RSA加密,直接抓取登陸時加密後的用戶名和密碼。

  二、分析登陸成功頁面的cookies,將其保存下來,請求時只需把cookies帶上。

相關文章
相關標籤/搜索