一、公開密鑰加密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帶上。