JS逆向爬虫案例分享(RSA非对称加密)

网站百科数据爬取之反爬策略JS逆向分析(二)

本次分享解析某域网站数据的反爬机制。

此次只做技术分享,如有侵权,请联系删除。

1、分析网站

需求目的:工业品网站百科数据信息。

JS逆向爬虫案例分享(RSA非对称加密)
如下图:

JS逆向爬虫案例分享(RSA非对称加密)
明显可以看出三个参数,knowledgeId详情Id、sign加密字段、timestamp时间戳。重点在sign的获取。那就开始sign参数的解密过程吧。
首先找到生成sign的相关js代码。如图所示:
JS逆向爬虫案例分享(RSA非对称加密)
; 2、JS文件解密分析

可以看出跟函数getByCodeKnows有关,分析代码。先放出JS结果代码如下:

var NodeRSA = require('node-rsa')

var privateKeyStr = "MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQABAoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fvxTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeHm7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAFz/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIMV7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATeaTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5AzilpsLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Ozuku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876";
var pri = "-----*********-----".concat(privateKeyStr, "-----END RSA PRIVATE KEY-----");
var privateKey = new NodeRSA(pri);
function getByCodeKnows() {
    var timestamp = new Date().getTime();
    var sign = privateKey.sign(timestamp, "base64", "utf8");
    item = {"timestamp": timestamp, "sign": sign}
    return item
}
console.log(getByCodeKnows())

由代码可以看出JS加密涉及到RSA加密算法,首先就要去下载node-rsa模块,导入模块,变量privateKeyStr从JS文件中得知是个常量,变量pri由privateKeyStr与”—–**—–“和”—–END RSA PRIVATE KEY—–“拼接而来。接着就是对常量pri进行RSA加密生成密钥,前面已经导入了node-rsa模块,直接运用NodeRSA()方法,得到privateKey值。下面就很简单了,一个是获得时间戳、然后就是编码转换获得sign值。这里简单介绍一下RSA算法。

RSA

非对称加密,一般由发送方(客户端)和接收方(服务端)各持有一对公钥和私钥。

私钥可以推出公钥,公钥不能推出私钥。

数据交换的过程中,双方交换自己的公钥。各自私钥不公开。

发送时使用对方的公钥进行加密。接收对方发来的密文时,使用自己私钥进行解密。

发送方使用私钥将信息进行加签(签名),将密文与签名作为参数发起请求。

接收方用自己私钥解密得到的明文,请求方公钥,接收的签名,进行验签(签名验证)。

RSA签名和验签的作用
为了增强数据交换的安全性。

假设不进行签名和验签:
发送方(客户端)的请求,可能被第三方拦截(中间人攻击)。中间人在拦截发送方请求(不知道拦截的请求参数明文)由于接收方(服务端)的公钥是公开的,中间人可以使用公钥对参数加密,替换拦截到的参数密文,发送给原接收方(服务端)。(当然这个发送的参数格式是什么,中间人知道不知道就另寻它路了)这导致接收方(服务端)无法判断得到的请求是否是可信的客户端发送的。(因为请求头什么的都是对的,参数被中间人替换了)发送方如果增加签名可以不用加密请求参数,但第三方拦截后能看到请求参数的明文(参数格式和内容被公开)。
安全性的前提是私钥没有泄露,私钥若被攻击者获取了,那么签名也可以伪造了。

结果展示

运行js代码,查看结果。如下图:

JS逆向爬虫案例分享(RSA非对称加密)
可以看到返回的字典中包括了时间戳以及sign的值,那么接下来就很简单了,可以通过postman模拟接口请求或者直接编写爬虫代码验证,我直接编写爬虫代码实现验证。
; 3.、爬取数据

在得到sign字段的值后,编写爬取代码就简单了,观察得到是POST请求,form表单提交请求数据,编写headers请求头,需要pyexecjs模块是python爬虫库里关于javaScript的一套程序,它能帮你解析python代码的js代码。 有经验的爬虫程序员应该知道,在你的请求头中有一部分是被js代码加密的,而这一套js加密程序就保存在你当前访问的网站中(事实上就是存在本地),每一次访问都需要调用js做加密再请求。这个机制可以抵挡大部分的爬虫程序,除非你模仿js加密程序之后再做请求。你可以模拟js程序写一段python程序,也可以直接把网页里的js代码复制下来,使用pyexecjs模块来运用。其最终实现部分爬虫代码如下:

    def get_detail_request(self,knowledgeId,title):
        with open(r'js文件路径', 'r',encoding='utf-8') as r:
            js = r.read()
        jsdm = execjs.compile(js)
        result = jsdm.call('getByCodeKnows')
        timestamp=result.get("timestamp")
        sign=result.get("sign")
        start_url="请求的网站链接"
        headers = {
            "Accept": " application/json, text/plain, */*",
            'accept-encoding': 'gzip, deflate, br',
            'accept-language': 'zh-CN,zh;q=0.9',
            'Content-Type': ' application/json',
            'Origin': ' **********',
            'Referer':' **********',
            'User-Agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
        }
        meta={
            "knowledgeId":knowledgeId,
            "title":title,
        }
        params: dict = {"sign":sign,"timestamp":timestamp,"knowledgeId": knowledgeId}

        return scrapy.Request( url=start_url,
                               method="POST",
                              callback=self.detail_parse,
                              headers=headers,
                               meta=meta,
                               body=json.dumps(params),
                               dont_filter=True)

    def detail_parse(self, response):
        title=response.meta["title"]
        MongoHelpS = MongoHelp("localhost", "GuAnJie", "baike_category_deatil")
        data_text=response.text
        data_json=json.loads(data_text)
        data=data_json["data"]["categoryKnow"]
        knowledge=data["knowledge"]
        item={"title":title,"knowledge":knowledge}
        MongoHelpS.insert(item)

最终实现爬取数据如图:

JS逆向爬虫案例分享(RSA非对称加密)

Original: https://blog.csdn.net/weixin_36723038/article/details/127111965
Author: 欧菲斯集团
Title: JS逆向爬虫案例分享(RSA非对称加密)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/788851/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 探索小程序底层架构原理

    双线程架构 在这之前,我们先来思考一个问题,小程序在架构上为什么会选择双线程? 为什么是双线程? 加载及渲染性能 小程序的设计之初就是要求快速,这里的快指的是加载以及渲染。 目前主…

    Python 2023年10月12日
    089
  • Matplotlib(基本用法)

    Matplotlib 是数据分析绘图的常见模块,可以算是 2D-绘图(Python)领域使用最广泛的套件,可以将数据图形化,并且提供多样化的输出格式,利于数据的显示并分析。 接下来…

    Python 2023年11月1日
    056
  • python matplotlib绘图概述【超全】

    python作为最常用的语言之一,其绘图功能也是及其强大的,但程序绘图有个通病,细节调整的时候比较麻烦,很多参数不知道如何设置,因此本文概述了python绘图的总体框架及绘图参数的…

    Python 2023年9月1日
    072
  • dataframe 设置空值_DataFrame的运算,排序和空值处理

    函数应用 df = pd.DataFrame(np.arange(12).reshape(4,3), columns=list(‘bde’), index=…

    Python 2023年8月7日
    076
  • 【转】JsonPath基本用法

    本文主要介绍JsonPath的基本语法,并演示如何在Newtonsoft.Json中进行使用。 JsonPath的来源 看它的名字你就能知道,这家伙和JSON文档有关系,正如XPa…

    Python 2023年6月3日
    073
  • Maven安装与配置教程

    文章目录 * – 1 什么是Maven – + * 1.1 Maven概述 * 1.2 Maven的常用命令 – 2 怎么安装Maven &#8…

    Python 2023年9月26日
    045
  • pytest框架–pytest前置和后置

    可以和selenium、requests、appium结合实现web自动化、接口自动化、APP自动化 可跳过用例且失败用例可重跑 结合allure生成美观的测试报告 与Jenkin…

    Python 2023年9月9日
    054
  • Python-Scrapy获取百望税务问题

    Python-Scrapy获取百望税务问题 Scrapy获取百望税务问题 * 1. 创建scrapy项目: 2.settings文件设置 3. Itrm设置 4. 创建Spider…

    Python 2023年10月4日
    054
  • Python爬虫详解

    1、任务介绍 需求分析 爬取豆瓣电影Top250的基本信息,包括电影的名称,豆瓣评分,评价数,电影概况,电影链接等。 https://movie.douban.com/top250…

    Python 2023年6月9日
    076
  • python读取txt中数据转为列表

    import numpy as np #直接读取 a=np.loadtxt("D:…

    Python 2023年8月28日
    033
  • pandas 数据透视表

    pandas 数据透视表及逆透视 主要参数说明 pd.pivot_table(df,index= [] ,columns= [] ,values = [] , aggfunc={&…

    Python 2023年8月18日
    039
  • pycharm使用pytest相关配置

    pycharm 异常关闭后如何恢复 * – project模式下不显示文件目录 – python虚拟机环境需要重新配置,当前SDK已经被损坏 –…

    Python 2023年9月11日
    048
  • Pytest基础使用

    Pytest基础使用 前言:Pytest是一款成熟的Python测试框架,完全正向兼容unittest。简洁可以实现参数化,自带测试报告;第三方库注意版本兼容。 pip insta…

    Python 2023年9月11日
    048
  • 数据结构初阶–二叉树介绍(基本性质+堆实现顺序结构)

    树的相关概念 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为2叶节点或终端节点:度为0的节点称为叶节点; 如上图:D、F、G、H为叶节点非终端节点或分支节点:度…

    Python 2023年10月14日
    044
  • 【JAVA高级】——Druid连接池和Apache的DBUtils使用

    ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。🍎个人主页:Java Fans的博客🍊个人信条:不迁怒,不贰过。小知识,大智慧。💞当前专栏:JAVA开发者成长之路✨特…

    Python 2023年8月2日
    057
  • Anaconda||(踩坑无数,含泪总结!!!)Anaconda的卸载与安装(tensorflow+Keras+spyder+添加镜像源)

    记:遥想当初的我(其实也就是一年前啦~),年少无知,由于做学校作业项目的需要,要求自行安装Anaconda,我就在网上找教程,东一篇西一篇,拼拼凑凑地安装完了。期间踩的坑不计其数,…

    Python 2023年8月1日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球