目标页面:aHR0cHM6Ly9jb250ZW50LXN0YXRpYy5jY3R2bmV3cy5jY3R2LmNvbS9zbm93LWJvb2svaW5kZXguaHRtbD90b2Nfc3R5bGVfaWQ9ZmVlZHNfZGVmYXVsdCZzaGFyZV90bz13ZWNoYXQmaXRlbV9pZD03MzY1MjM2OTQ3MjExOTIxODA5JnRyYWNrX2lkPTM0NUU4NjI5LUNGNjQtNEYyQy1BMzYxLUI3RUI0REEzOTQ0QV82NjE2NDg0MzM2NDE=

目标有了,我们看看数据获取:

找到目标接口后看到目标数据。

很明显的加密base64(做爬虫最基本的,需要一看能感觉到的加密方式了),我们校验一下:

证实了是内容进行了base64加密,也确定了我们的目标。

分析接口参数和请求头:

接口参数只需要一个id,就是页面链接的item_id。

请求头就复杂了

其中第三个是加密后的东西

第一个第二个是固定的,不赘述。第四个明显时间戳,也不多说。我们主要看看 x-emas-gw-sign。

开始尝试解密:

搜到一个结果:

进去看看:

按照123的顺序看:

x-emas-gw-sign就是l

l是对d进行操作获取的

d是固定字符串,h,c,t,e进行拼接,那我们断点看看h,c,t,e都是啥。加密方法又是啥

上图可以看见

h:4d8e87e1f391f71eda7d211b850b6687  不知

c:1640075943  时间戳

t:emas.feed.article.server.getArticle  固定值

e:1.0.0  固定值

多次确认。只有h是未知的

但是h就很神奇。

它是由f经过o()处理之后得到的,f:articleId=7365236947211921809也很简单,是articleId=和上面提到的的item_id的固定组合。

但是我们现在调试出来的h:

相差甚大,根本不是一个东西。进入o()添加断点也调试不出来自己想要的结果。

调了一下午也没调出个结果,毫无进展。但是发现了

h:4d8e87e1f391f71eda7d211b850b6687

是一直没变的。这就说明了它是定值加密的。而h加密用到的只有f,也就是说h极大可能是f加密获取的,这也解释了为什么不同文章链接的h值不同,相同文章h值相同了原因了。

看一下h的特点,经常接触加密的第一反应应该是md5,试试:

一毛一样。

继续往下

同样的,s()方法断点的调试也很麻烦,频繁出现了无法获取和无法构造的参数。

下面是s()方法的截图:

因此,l = u.a.stringify(s()(d, "emasgatewayh5"))的加密也是很难调试的

他涉及了时间戳,所以每次调试肯定不一样,但是我们注意到。它传值传了d的同时,传了一个固定值 emasgatewayh5

我们可以合理怀疑他是需要一个key对d进行加密。而且在s()方法很显眼的HMAC。

我们是不是可以尝试一下?

好像又是一模一样。

到此我们也就摸清这个加密。这个很难调试的js。

其实整个看下来,这个网站用到了常见的三种加密:base64,md5,hamc。有时调试困难就需要玩爬虫的程序员对加密有基本的了解,往往事半功倍。

代码:

import hashlib
import hmac
import re
import timeimport requestsdef md5Encryption(str, key=''):  # MD5解密md = hashlib.md5(key.encode(encoding='utf-8'))  # 创建md5对象md.update(str.encode(encoding='utf-8'))return md.hexdigest()def get_sign():startUrl = 'https://xxx.com/snow-book/index.html?toc_style_id=feeds_default&share_to=wechat&item_id=7365236947211921809&track_id=345E8629-CF64-4F2C-A361-B7EB4DA3944A_661648433641'articleId = re.search('item_id=(\d+)', startUrl).group(1).strip()infoApi = "https://emas-api.cctvnews.cctv.com/h5/emas.feed.article.server.getArticle/1.0.0?articleId=%s" % articleId# 获取签名ts = round(time.time() / 1000)  # 时间戳f = "articleId=%s" % articleId  # 固定拼接字符串key = 'emasgatewayh5'  # 进行sha256加密用到的keykeyByte = bytes(key, 'UTF-8')# 将f进行md5加密后,在进行固定拼接d = "&&&20000009&" + md5Encryption(f) + "&" + str(ts) + "&" + "emas.feed.article.server.getArticle" + "&" + "1.0.0" + "&&&&&"# 使用key对拼接完的字符串进行加密sign = hmac.new(keyByte, d.encode(), hashlib.sha256).hexdigest()headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36","x-emas-gw-appkey": "20000009","x-emas-gw-pv": "6.1","x-emas-gw-sign": sign,"x-emas-gw-t": str(ts),}resp = requests.get(infoApi, headers=headers)print(resp.json())if __name__ == '__main__':get_sign()

借x-emas-gw-sign解密,讲讲常见加密相关推荐

  1. 史上最全总结!爬虫常见加密解密算法

    文章目录 简介 JavaScript 加密解密模块 Crypto-JS Node-RSA JSEncrypt Python 加密解密库 Cryptodome & Crypto Hashlib ...

  2. 常见加密解密简单总结

    随着互联网的快速发展,它已经成为了我们生活中不可或缺的一部分.与此同时,拥有一个安全的互联网环境成为了我们每个人心声.目前在公司里边所做的事情,也涉及到了加密解密这一块的东西,之前没有怎么接触过,所以 ...

  3. 【Python网络爬虫】爬虫常见加密解密算法

    ](https://img2020.cnblogs.com/blog/2501174/202108/2501174-20210816091906408-1932195692.png) 简介# 本文总结 ...

  4. alin的学习之路:加密相关知识(加密和解密,常见加密算法,消息验证码HMAC,数字签名)

    alin的学习之路:加密相关知识(加密和解密,常见加密算法,消息验证码HMAC,数字签名) 1. 加密和解密 1.1 加密的三要素 原始数据 加密操作: 明文 -> 密文 解密操作: 密文 -& ...

  5. 淘宝 h5获取店铺所有宝贝销量 sign解密

    淘宝 h5获取店铺所有宝贝销量 sign解密 淘宝的sign加密在mtop.js中 通过图片我们可以看到 sign== j 而 j = h(d.token + "&" + ...

  6. 常见加密解密和URL编解码

    常见加密解密和URL编解码 Base64 概念: 基于64个可打印字符,用于表示二进制数据,使用的字符包括大小写拉丁字母各26个.数字10个.加号+和斜杠/,共64个字符,等号=用来作为后缀用途 2^ ...

  7. 【爬虫逆向案例】某道翻译js逆向—— sign解密

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! [爬虫逆向案例]某道翻译js逆向-- sign解密 1.前言 2.步骤 3.源码 4.号外 1.前言 相信各位小伙 ...

  8. 单片机常见加密方法有哪些?如何对单片机进行解密?

    为增进大家对单片机的认识,本文将对单片机的常见加密方法以及单片机解密方法予以介绍. 单片机可以说是一个小型计算机,通过单片机,可以开发出来很多有意思的东西.为增进大家对单片机的认识,本文将对单片机的常 ...

  9. ios常见加密解密方法

    在其他平台中经常会计算MD5值,在ios平台中也提供了该方法,首先需要导入头文件 [cpp] view plaincopy #import <CommonCrypto/CommonDigest. ...

最新文章

  1. NVME CLI -- nvme 命令查看NVME设备内部状态
  2. 豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」
  3. SparkStreaming - 无状态与有状态 updataStateByKey
  4. Vue.set()实现数据动态响应
  5. java的开发环境日蚀日_将依赖项添加到后未解析geotools的导入pom.xml文件在日蚀中...
  6. 华为程序员:加了六天班,加班费一万四,网友:我能加到它破产
  7. 响应式mysql_Spring Data R2DBC响应式操作MySQL
  8. Oracle 日期时间函数详解
  9. 逻辑或( || )和逻辑与( )的关系
  10. 微信小程序开发——websocket(socket在线测试服务器,或本地socket服务器)
  11. 详解金盾2016替换机器码的几个关键步骤
  12. BroadcastReceiver生命周期探讨
  13. C语言程序设计现代方法-第二版-第10章练习题
  14. 查询某一天内所有数据(SQL)
  15. 肾有多好人就有多年轻—男女通用
  16. 2021年中式烹调师(初级)模拟考试系统及中式烹调师(初级)实操考试视频
  17. .net RPC框架选型(一)
  18. 小扎不要「脸」了?Facebook正式改名Meta!买它,满仓元宇宙
  19. 有关3d引擎优化的一些搜索整理
  20. WeTool 必须死(含最新动态)

热门文章

  1. 忘性大,关于ACCESS的一点点。
  2. 常见算法思想——贪心法
  3. 如何从一个美术变成程序员?
  4. 观“赵玉平团队管理”观后感
  5. 使用qemu-img转换镜像格式
  6. 通过TCP协议实现通信
  7. 教学向|zbrush建模技巧,曲率遮罩是什么?怎么做?
  8. HTML滚动条样式修改
  9. 寂静岭3java攻略_《寂静岭3HD》通关心得:感人之佳作
  10. 成都学院计算机科学与技术怎么样,四川师范大学成都学院计算机科学与技术(本科)教育概况...