當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JS加密方式
常見加密方式:
加密:
前端{
1.把加密的數據給后端
2.JS加密
3.攜帶正確的參數——進行加密}
后端:存入數據庫或者校驗
為了反爬,前端請求就會進行攜帶指定的參數,參數的值會進行加密,后端再進行校驗
1.MD5加密
概念:線型散列算法(簽名算法)
加密:產生一個固定長度的十六進制的數據(32位或16位)
解密:常規的說法:MD5是不存在解密的(不可解密)。
理論上可以破解——暴力破解,逐個比對,輪詢,但需要龐大的數據量、長時間、高性能機器。
JS如何進行MD5加密?
壓縮文件:命名符合規范,就會有min
https://cdn.bootcss.com/blueimp-md5/1.1.0/js/md5.min.js
未壓縮文件:https://cdn.bootcss.com/blueimp-md5/1.1.0/js/md5.js
開發階段選擇未壓縮文件,可讀性強,部署階段用壓縮文件,節約空間
JS實現:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>MD5</title> </head> <body><script type="text/javascript" src="http://cdn.bootcss.com/blueimp-md5/1.1.0/js/md5.min.js"></script><script type="text/javascript">//MD5加密var sign = md5('123456')console.log(sign)</script> </body> </html>python實現:
from hashlib import md5def md5_encryption(code):'''md5加密——方法返回對象:param code: str類型,要加密的字符串:return:str:返回加密后的字符串'''md = md5() #實例化——得到MD5加密對象md.update(code.encode()) #生成加密數據return md.hexdigest() #獲取加密數據if __name__ == '__main__':sign = md5_encryption('123456')print(sign,len(sign))實例:有道翻譯JS逆向(MD5)
需求:抓取有道的接口,實現翻譯的功能
步驟:
1.參數分析步驟
(1)ctrl+shift+f全局搜索參數字段
(2)逐個分析
(3)拆解:假設、驗證,console ,斷點進行參數查看
2.python實現
spider.py
import scrapy from time import time import random from hashlib import md5class YoudaoSpider(scrapy.Spider):name = 'youdao'# allowed_domains = ['www.xxx.com']start_urls = ['https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule',]def start_requests(self):# 獲取查詢單詞word = input('請輸入你要查詢的單詞:')# 獲取當前時間戳lts = str(int(time() * 1000))# 獲取saltsalt = lts + str(random.randint(0, 9))# 獲取signsign = "fanyideskweb" + word + salt + "Y2FYu%TNSbMCxc3t2u^XT"md = md5() # 實例化——得到MD5加密對象md.update(sign.encode()) # 生成加密數據sign = md.hexdigest()post_data = {'i': word,'from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb','salt': salt,'sign': sign,'lts': lts,'bv': '679a714475741baa9769e4725c532bb7','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web','action': 'FY_BY_REALTlME',}# 將cookie轉成字典類型cookies = 'OUTFOX_SEARCH_USER_ID=1370777476@2409:8920:400:46ac:a171:61b:7868:1c32; OUTFOX_SEARCH_USER_ID_NCOO=1092215250.8540661; UM_distinctid=179d34a1f154d-057d5ca47388f3-6701b35-144000-179d34a1f161e3; JSESSIONID=aaap-S9l5WclRfOMVkgQx; ___rl__test__cookies='+ltscookies = {i.split('=')[0]: i.split('=')[1] for i in cookies.split('; ')}print(post_data)# 手動發送post請求yield scrapy.FormRequest(url = self.start_urls[0],headers={'Host': 'fanyi.youdao.com','Origin': 'https://fanyi.youdao.com','Referer': 'https://fanyi.youdao.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36',},formdata=post_data,callback=self.parse,cookies = cookies)def parse(self, response):print(response,response.text)2.DEF/AES加密
概念:對稱性加密算法
DES加密:
from Cryptodome.Cipher import DES import binascii from time import time import random class MyDESCipher:def __init__(self,key,iv):self.key = keyself.iv = ivdef encryption(self,data):''':param data::return:'''cipher = DES.new(self.key,DES.MODE_CFB,self.iv)data = data.encode()return binascii.b2a_hex(cipher.encrypt(data))def decryption(self,data):'''解密:param data:十六進制轉二進制:return:'''data = binascii.a2b_hex(data)cipher =DES.new(self.key,DES.MODE_CFB,self.iv)#創建相同的規則return cipher.decrypt(data).decode()if __name__ == '__main__':#需要加密的數據word = 'hello world'lts = str(int(time() * 1000)) # 獲取當前時間戳salt = lts + str(random.randint(0, 9)) # 獲取saltsign = "fanyideskweb" + word + salt + "Y2FYu%TNSbMCxc3t2u^XT" # 獲取sign# 秘鑰key = b'maquYIGE'iv = b'12345678'myDEFCipher = MyDESCipher(key,iv)res = myDEFCipher.encryption(sign)print(res)data = myDEFCipher.decryption(res)print(data)AES加密:
from Cryptodome import Random from Cryptodome.Cipher import AES import binascii from time import time import random class MyAESCipher:def __init__(self,key,iv):self.key = keyself.iv = Random.new().read(AES.block_size)def encryption(self,data):''':param data::return:'''cipher = AES.new(self.key,AES.MODE_CFB,self.iv)data = data.encode()return binascii.b2a_hex(cipher.encrypt(data))def decryption(self,data):'''解密:param data:十六進制轉二進制:return:'''data = binascii.a2b_hex(data)cipher =AES.new(self.key,AES.MODE_CFB,self.iv)#創建相同的規則return cipher.decrypt(data).decode()if __name__ == '__main__':#需要加密的數據word = 'hello world'lts = str(int(time() * 1000)) # 獲取當前時間戳salt = lts + str(random.randint(0, 9)) # 獲取saltsign = "fanyideskweb" + word + salt + "Y2FYu%TNSbMCxc3t2u^XT" # 獲取sign# 秘鑰,偏移向量(16位)key = b'maquYIGEmaquYIGE'#iv = Random.new().read(AES.block_size)myAESCipher = MyAESCipher(key,iv)res = myAESCipher.encryption(sign)print(res)data = myAESCipher.decryption(res)print(data)3.RSA加密
概念:非對稱性加密算法
兩個秘鑰,分為秘鑰:公鑰和私鑰,私鑰由公鑰計算得到。
公鑰對數據進行加密,只有使用對應的私鑰才能解密。
優點:算法復雜
缺點:比對稱加密慢
自定義加密方式
總結
- 上一篇: 速卖通韩国下载量再次登顶,7500万投资
- 下一篇: 迅雷某页面存在sql注入漏洞