JS加解密,python

之所以写这篇文章是因为之前在做一些爬虫项目的时候遇到在url或者header头中的加密参数,每次请求都需要变换,如果用chromdriver来解析的话耗费资源比较高,且耗时长,而刚接触 js 逆向的时候真的是头皮发麻,另外这里不谈哪个网站的加密参数,只说方法。

 

到现在为止遇到的参数加密类型主要分为两类:

第一类: 在请求数据接口之前不需要发起其它请求,其中可能只需要你连接中的数个参数或者页面中的一些信息来生成一个值;

第二类:在请求数据接口前还需要请求一段文本与来生成加密值,并且会在你的 cookie 中加入数一些信息,这里又分为两种(1. 这段文本是加密参数,2,这段文本是一段 js(可能是加密的),在浏览器中运行会生成你需要的值)。

 

 

想要用自己的代码来生成加密参数又分为两步:

第一步:找到生成加密参数方法,这里使用chrom浏览器。两种方法(1. 在开发者工具的 sources 栏中搜索数据接口中的关键字, 2.在开发者工具中的 Network 中抓一下包,找到你需要的那个请求,鼠标移动至那条请求的 Initiator 栏中,会显示这条请求所使用的函数),然后就是 debug 之路。这里就不贴截图了,想详细学习的话可以找依照 js加解密系列的视频。

如果你已经找到加密函数后,请往下看,不然的话还是继续找吧。

第二步:执行加密方法,生成加密值。 另外,我这里使用的是 PyExecJS,虽然 PyV8的效率比较高,但是安装比较烦,不兼容。这里还是介绍两种方式:

一. 利用 selenium 和 chromdriver ,首先实例化一个浏览器,然后打开一次你所需要的数据接口所在的页面,这是为了加载一次js, 如果加密类型是第一大类的话,可以直接利用浏览器实例的 execute_script 方法来执行一段js代码,这段代码可以是调用加密函数的代码,然后浏览器实例不要关闭等待下次使用。注:如果不是必须,推荐使用这种方法,因为相比下面那种方法,这个还是比较省力的;如果加密类型是第二大类的话可以先使用 requests 把 所需要文本给请求一次,然后在使用 execute_script 方法的时候作为参数传入进去就ok。

二. 这个就是不断的进行 debug ,然后把自己把需要的js代码给赋复制粘贴下来,因为js中有很多地方会使用到浏览器的 windows,documen等对象,甚至还有什么先在 html 标签的属性中写入一个值,在接下来的运算中再取出来进行计算这种骚操作,所以就需要改写 js 了。 这里可以给到大家几条经验,你猜是几条。。。。。。

JS改写的两条经验(没错,就是 2 )!!:

1.JS代码中如果遇到什么 三元表达式 、&&、|| 这种从HTML中拿东西的话,可能只是为了判断真假,这里你可以直接改写为布尔值;

2.在js代码中遇到什么 crypto 或者是 cryptoJS的话,就可以使用 PyExecJS 来解析了,不过你需要更换PyExecJS的引擎。PyExecJS的默认引擎为  JScript,这点你可以通过打印  execjs.get().name 来验证,你现在需要 安装node.js 并放到环境变量中,再次打印  execjs.get().name ,如果现在结果为 Node.js (V8) 的话,就说明你成功了。 其中 node 环境中已经有 crypto , 如果需要 cryptoJS 的话还需要安装 crypto-js 包。

这里提供一款JS调试工具:https://download.youkuaiyun.com/download/meteorcountry/10842095

珍爱生命,远离爬虫,且行且珍惜。

### Python 中与 Crypto-JS 兼容的 AES 加解密实现 为了确保 JavaScript 使用 `CryptoJS` 进行加密后的数据能够在 Python 中成功解密,必须遵循相同的加密模式和参数设置。下面展示了如何在 Python 中使用 `pycryptodome` 库来实现与 `CryptoJS` 的 AES 加密/解密兼容。 #### 安装依赖库 首先安装所需的 Python 库: ```bash pip install pycryptodome ``` #### 实现代码 ##### 1. 加密函数 JavaScript中的`CryptoJS.AES.encrypt()`默认采用CBC模式并带有PKCS7填充[^3]。因此,在Python端也需要保持一致: ```python from base64 import b64encode, b64decode import hashlib from Cryptodome.Cipher import AES from Cryptodome.Random import get_random_bytes from Cryptodome.Util.Padding import pad, unpad def encrypt(plain_text, password): salt = get_random_bytes(AES.block_size) private_key = hashlib.scrypt( password.encode(), salt=salt, n=2**14, r=8, p=1, dklen=32) cipher_config = AES.new(private_key, AES.MODE_CBC) cipher_text_bytes = cipher_config.encrypt(pad(plain_text.encode('utf-8'), AES.block_size)) iv = b64encode(cipher_config.iv).decode('utf-8') encrypted = b64encode(cipher_text_bytes).decode('utf-8') result = { 'cipherText': encrypted, 'iv': iv, 'salt': b64encode(salt).decode() } return result ``` ##### 2. 解密函数 当接收到由`CryptoJS`产生的密文时,可以按照如下方式对其进行解码: ```python def decrypt(enc_dict, password): enc_cipher_text = b64decode(enc_dict['cipherText']) salt = b64decode(enc_dict['salt']) iv = b64decode(enc_dict['iv']) private_key = hashlib.scrypt(password.encode(), salt=salt, n=2**14, r=8, p=1, dklen=32) cipher = AES.new(private_key, AES.MODE_CBC, iv=iv) decrypted = unpad(cipher.decrypt(enc_cipher_text), AES.block_size) return decrypted.decode('utf-8') ``` 上述代码片段实现了基于密码派生秘钥的功能,并采用了与`CryptoJS`相匹配的安全散列算法(scrypt)。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值