Python爬虫编程11——JS反爬

环境搭建

安装node.js

下载网站:Download | Node.jsicon-default.png?t=M276https://nodejs.org/en/download/

参考网站:Node.js安装与环境配置_各自安好、的博客-CSDN博客_nodejs安装及环境配置icon-default.png?t=M276https://blog.csdn.net/qq_41465646/article/details/107656044

安装js代码调试工具

使用VScode可以调试JS代码:
tips:VScode不会自动默认保存执行修改之后的代码,如果需要自动保存的话:
settings‐‐> off 修改为 onFocusChange。

安装 PyExecJs模块

安装pyexecjs模块可以在python中运行调试好的js的代码。

JS中常见的算法

  • 线性散列MD5算法
  • 对称加密DES/AES算法
  • 非对称加密算法RSA
  • base64加密算法

MD5算法

MD5是一种被广泛使用的线性散列算法,可以产出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度(32位或16位)数据。

JSMD5算法:

https://cdn.bootcdn.net/ajax/libs/blueimp-md5/1.0.1/js/md5.jsicon-default.png?t=M276https://cdn.bootcdn.net/ajax/libs/blueimp-md5/1.0.1/js/md5.js

MD5加密网站:

md5在线解密破解,md5解密加密 (cmd5.com)icon-default.png?t=M276https://www.cmd5.com/

DES/AES算法

DES对称加密,是一种比较传统的加密方式,其加密运算解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密钥(称为对称密码),是一种对称加密算法。

AES和DES的区别

1.加密后密文长度不同

(1)DES加密后密文长度是8的整数倍;

(2)AES加密后密文的长度是16的整数倍;

2.安全度不同

(1)一般情况下DES足够安全;

(2)如果要求更高可以使用AES;

3.DES和AES修改只需要修改:CryptoJS.DES =>CryptoJS.AES

encrypt() 加密
decrypt() 解密

一般情况下,在开发者工具中扣取JS代码时,如果没有password之类的关键字,可以直接search出encrypt和decrypt。

RSA算法

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。

非对称加密需要两个密钥:

  • 公开密钥(publickey:公钥)
  • 私有密钥(privatekey:私钥)
  • 公钥和私钥是一对
setPublicKey() 设置公钥(可以搜索该关键字)

base64加密算法

base64是一种用64个字符来表示任意二进制数据的方法。

base64使用 A--Z a--z 0--9 + / 这64个字符实现对数据的加密。

进行JS调试的流程

1. 调试工具 ( 黄条 ) 灰色箭头是执行当前的下一条语句 ,蓝色三角形是跳到下一 个断点处。
2.
(1) 利用某个加密字段搜索:开发者工具右上角三个点 ‐‐> 选择 search‐‐> 搜索;
(2) 点击进搜索结果里面 ‐‐> 点击左下角的花括号 进行格式化处理
(3) 在当前文件里面用鼠标及进行聚焦 ‐‐>ctrl+f 再次搜索加密字段
(4) 找到可疑的加密字段打上断点进行调试; 借助花括号下面的下划线找到函数开始和结束的位置。
3.
(1)在加密字段中有Initiator,可以进入里面查看源码,注意最下面的是最早执行的,所以要从最上面开始逐一进入找到加密字段在其中是否被加密;
(2)其余步骤与2中一致;

 4.

(1)如果碰到加密算法不是很长,可以复制下所有的代码行;

(2)如果加密代码比较长 ,如果没有JS的基础;最好使用python去重构一下加密过程(需要得到

重构时所必须的一些参数 )。
(3)注意关键字:setPublicKey ‐‐‐> RSA;encrypt decrypt ‐‐> DES/AES
                                                        
Python重构AES加密算法
from Crypto.Cipher import AES
from cryptography.hazmat.primitives.padding import PKCS7
from cryptography.hazmat.primitives.ciphers import algorithms

def pkcs7_unpad(content):
    """
    解密:Pkcs7的填充方式
    """
    if not isinstance(content, bytes):
        content = content.encode()
    pad = PKCS7(algorithms.AES.block_size).unpadder()
    pad_content = pad.update(content) + pad.finalize()
    return pad_content


def aes_encrypt(res, key, iv=''):
    # 转码  utf-8  字节 16进制
    new_key = bytes(key, encoding='utf-8')
    new_iv = bytes(iv, encoding='utf-8')
    # 创建一个AES算法 秘钥  模式 偏移值
    cipher = AES.new(new_key, AES.MODE_CBC, new_iv)
    # 解密
    data = cipher.decrypt(bytes.fromhex(res))
    # Pkcs7的填充方式
    return pkcs7_unpad(data)

Python重构DES加密算法

# pip install pyDes -i https://pypi.tuna.tsinghua.edu.cn/simple
from pyDes import des, CBC, PAD_PKCS5, ECB
import base64


def des_encrypt(password, key, iv='', model='CBC'):
    '''
    DES加密
    :param password: 密码明文
    :param key: 密钥
    :param iv: 秘钥偏移量
    :param model: 加密模式 CBC ECB
    :return: 加密之后的数据
    '''
    # 创建des对象
    if model == 'CBC':
        # PAD_PKCS5 为填充方式
        des_obj = des(key[:8].encode('utf-8'), CBC, iv.encode('utf-8'), padmode=PAD_PKCS5)
    else:
        # ECB加密模式 不需要iv秘钥偏移量
        des_obj = des(key[:8].encode('utf-8'), ECB, padmode=PAD_PKCS5)
    # 通过des对象处理数据
    encrypt_content = des_obj.encrypt(password.encode('utf-8'))
    result = base64.b64encode(encrypt_content).decode()
    return result

Python重构RAS加密算法

# pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as cry_pksc1_v1_5
import base64


def encrypto(pk, password):
    """
    使用公钥对密码进行加密处理
    :param pk: 公钥
    :param password: 明文密码
    :return: RAS加密之后的密码
    """
    public_key = "-----BEGIN PUBLIC KEY-----\n{}\n-----END PUBLIC KEY-----".format(pk)
    # 导入公钥 返回一个RSA秘钥对象
    rsakey = RSA.importKey(public_key)
    # 对需要加密的内容进行PKCS#1 v1.5加密
    cipher = cry_pksc1_v1_5.new(rsakey)
    # 使用公钥加密密码 密码必须是二进制
    miwen_encode = cipher.encrypt(password.encode())
    # 再使用Base64对类似字节的对象进行编码
    cipher_text = base64.b64encode(miwen_encode).decode()
    return cipher_text

5.安装JS外部资源库:

(1)cd进项目目录

(2)做国内资源映射:npm install ‐g cnpm ‐‐ registry=https://registry.npm.taobao.org

(3)安装: cnpm install node‐jsencrypt

6.过掉无限debug:

        第一种:设置条件断点:false
        第二种:选择Never pause here
        第三种:让页面所有断点都失效( 不推荐 )

7.在用python执行js代码的时候 碰着IndexError: list index out of range的解决方法:

python.exe 同级目录下面找到 Lib :里面有 subprocess.py
找到 init 里面的 encoding=
将那一行替换为pass_fds=(), *, encoding='utf‐8', errors=None, text=None):
8. 在使用 DES 做加密处理的时候 要注意模式和 iv 之间的关系 ( 了解即可 )
        如果是用的CBC 加密模式 需要 iv
        如果是用的EBC 加密模式 不需要 iv
        至于是用的哪种模式 要去js 代码中看

猜你喜欢

转载自blog.csdn.net/qq_52914337/article/details/123771663