最近刚接到一个爬取叮当快药app的需求,刚好看到

叮当快药(http://m.ddky.com/)的所有Ajax请求,都有一个sign参数(如下图所示)

如果修改了URL中的参数,服务端就会提示签名参数错误(如下图所示)。

这是一种现在很常见的反采集策略(签名验证机制),在手机App中的应用尤为广泛。如果有做过开发的都知道,前后端对接接口的时候会有又连接参数加密。本人之前有做过有python-web和pyqt桌面,就是用AES以及md5算法加密,sign就为其中重要一环。

这个签名参数(sign)是通过特定的算法对HTTP请求提交的其它参数计算而来的,服务器接收到HTTP请求之后会使用相同的算法计算出一个sign值,并和HTTP请求中的sign值做比较,如果不一致就认为这是一个无效的请求。

如果我们能破解这个算法就能自己构造出有效的sign值。那如何破解呢?

·对于安卓App来说我们可以通过反编译APK获取Java源码来实现。

·对于Web网站来说,我们可以通过分析网站的JS代码来实现。

在众多JS文件中寻找一个签名算法有点大海捞针的感觉,我们可以通过Fiddler的内容搜索功能,通过搜索"sign="这种关键词,快速定位算法所在的文件(如下图所示)。

通过查找最后定位到ddkyutils.js这个文件,如下图所示为计算sign参数的关键代码:

核心的一句是:

可以看出:sign = MD5(method + p + r)

·method就是请求URL中的method参数;

·p参数的构造方法JS代码中可以看到,它是根据url中除了sign和callback以外的其它参数,按照先后顺序拼接而成;

通过JS代码可以看出r是固定参数(固定值6C57AB91A1308E26B797F4CD382AC79D);

下面验证下这个算法:

chrome发出的一个实际的请求(根据店铺ID和分类获取分类下的商品):

上述请求对应的p参数的值(根据除了sign和callback参数之外的其它参数构造,按参数在url里的先后顺序)构造如下:

sign的计算方法:

sign = MD5(method + p + r)

Python测试如下:

如下图所示,可以看到我们计算出来的sign和浏览器发出的sign一致(均是CD6AA445E364C59A71561186E5992991)。

完整叮当快药签名参数(sign)计算过程Python代码如下:

#python2写法import re
import urllib
import hashlib  # 原始参数,无sign和callback参数
url_params='city=%E6%9D%AD%E5%B7%9E%E5%B8%82&compositeId=20&idfa=F4773FA6FA05AE09970A2AEB58E83AC0&lat=30.252614410934047&lng=120.2163546837817&method=ddky.cms.search.cate.list.recipe&orderTypeId=0&pageNo=1&pageSize=20&plat=H5&platform=H5&shopId=204174&suite=1&t=2019-4-25%2012:2:30&userId=&v=1.0&versionName=5.2.0&wd='  # method参数
method = re.compile(r'method=([^&]+)').search(url_params).groups()[0]  # 构造出来的p参数
p = urllib.unquote_plus(url_params.replace('=', '').replace('&', ''))  #unquote_plus是参数解码 # r参数的值固定
r = '6C57AB91A1308E26B797F4CD382AC79D'  # 计算sign
sign =  hashlib.md5(method + p + r).hexdigest().upper()
print sign 

那篇文章还是python2写法,以下是个人转为python3

#python3写法import re
import hashlib
from urllib.parse import unquote_plus# 原始参数,无sign和callback参数
url_params = 'city=%E6%9D%AD%E5%B7%9E%E5%B8%82&compositeId=20&idfa=F4773FA6FA05AE09970A2AEB58E83AC0&lat=30.252614410934047&lng=120.2163546837817&method=ddky.cms.search.cate.list.recipe&orderTypeId=0&pageNo=1&pageSize=20&plat=H5&platform=H5&shopId=204174&suite=1&t=2019-4-25%2012:2:30&userId=&v=1.0&versionName=5.2.0&wd='# method参数
method = re.compile(r'method=([^&]+)').search(url_params).groups()[0]
print(method)# 构造出来的p参数
p = unquote_plus(url_params.replace('=', '').replace('&', ''))
print(p)# r参数的值固定
r = '6C57AB91A1308E26B797F4CD382AC79D'# 计算sign
m = hashlib.md5()
m.update(str(method + p + r).encode('utf-8'))
sign = m.hexdigest().upper()
print(sign)

输出结果:CD6AA445E364C59A71561186E5992991

本篇文章摘自:http://www.site-digger.com/html/articles/20190502/729.html

如何破解叮当快药的签名算法相关推荐

  1. 叮当快药难寻属于自己的解药

    奔跑了7个年头的叮当快药在近日终于向港交所递交上市申请,给自己一路风雨兼程打上了一个句号. 作为互联网大健康领域的一员,叮当快药是继阿里健康,平安好医生,京东健康之后,又一家在港交所上市的互联网医疗企 ...

  2. 叮当快药-登录协议+例程

    1.叮当快药URL:https://hapi.ddky.com 2.分析得知登录POST包是有加密的 https://hapi.ddky.com/user/rest.htm?userName=1234 ...

  3. 叮当快药:8090后养生报告

    最近,国内首家医药新零售平台叮当快药旗下叮当健康研究院发布了第三期健康报告--<时代C位人群健康养生数据报告>(以下称"报告"),全面揭示了当前年轻一代存在的健康隐患, ...

  4. 和京东、阿里健康正面刚,叮当快药胜算几何?

    自从O2O模式兴起以来,大健康领域也成为资本看好的赛道之一,尤其是送药到家服务一度成为风口.但经过了一番激烈的洗牌,快方送药.药给力.药快好等企业被迫出局,如今只有叮当快药硕果仅存,并屡获资本青睐,完 ...

  5. 叮当快药的“快”,美团买药的“轻”,都不及一个“对”?

    新年复工,大批务工人员回到工作岗位,开启孤独的生活. 换季忽冷忽热的气温变化令人猝不及防,染了风寒的独居打工人没人照料,想下楼买药都没有力气. "你好,XX送药,麻烦您开门取一下." ...

  6. 叮当快药产品体验报告

    前几天感冒了,不想出去,机缘巧合之下写了这份体验报告,也是为了能够达到"阿德老师亲自指导写报告"那个活动贴的要求,哈哈~~.外话,生活确实越来越便利了! 查看全文 http://w ...

  7. java计算机毕业设计基于安卓Android的校园快药APP-药店管理app(源码+系统+mysql数据库+Lw文档)

    项目介绍 本文介绍了校园快药APP软件开发建设的意义和国内外发展现状,然后详细描述了所开发手机APP的可行性分析,并分析了手机APP所要实现的功能.因为校园快药设施较多,而且人口密集,不能更好的管理校 ...

  8. java计算机毕业设计基于安卓Android的校园快药APP-药店管理app

    项目介绍  本文介绍了校园快药APP软件开发建设的意义和国内外发展现状,然后详细描述了所开发手机APP的可行性分析,并分析了手机APP所要实现的功能.因为校园快药设施较多,而且人口密集,不能更好的管理 ...

  9. 私域增长困境该如何破解?快鲸scrm私域运营解决方案帮你解决

    入局私域已成企业增长必备的重要运营手段.但在加速布局私域的同时,因缺乏完善的运营策略和产品解决方案,很多企业在私域运营过程中基本处于摸着石头过河的状态,进而导致不少困境的产生. 1. 没有私域运营顶层 ...

最新文章

  1. c++ 查找文件夹下最新创建的文件_Linux文件查找进阶知识,find命令的用法及解读...
  2. 用脑机接口去“搜索一下”,是种什么体验? | CCF C³-03@搜狗
  3. SQL Server 数据库基础编程
  4. go中NOSQL数据库操作
  5. IO流操作-图片操作(二)
  6. vue组件开发脚手架(vue-sfc-rollup),开发组件并发布至npm的利器
  7. 读不完的顶会Paper,我该如何读论文?
  8. 七月在线 《关键点检测概览与环境配置》
  9. 面试官问我:如何设计 QQ、微信等第三方账号登陆 ?
  10. 笔记整理之 SHELL 变量
  11. 点击ride界面edit空白_『技术锦囊』如何在SOLIDWORKS界面调用宏程序?
  12. 【每日一题】8月11日题目精讲—矩阵消除游戏
  13. MSP430F5529 DriverLib 库函数学习笔记(二)GPIO
  14. 浅谈 多任务学习 在推荐系统中的应用
  15. JavaScript学习(七十八)—实现对数据的浅拷贝和深拷贝
  16. 通过try、except和else的使用来使Python程序更加“强壮”
  17. 扩展卡尔曼滤波soc估算 基于EKF算法的锂电池SOC
  18. 对Si446x驱动库的一些修改
  19. CAD梦想画图中的“打断命令”
  20. matplotlib 笔记: contourf contour

热门文章

  1. COGS 1022 防线
  2. Thymeleaf语法详解
  3. c语言htons函数用法,在內核中C語言實現htons()函數
  4. codecombat之边远地区的森林1-11关及地牢38关代码分享
  5. leaflet自定义地图(非地理地图)
  6. While()和scanf的搭配使用问题
  7. javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
  8. Redis高性能原理:Redis为什么这么快?
  9. 钉钉“城市之光”见证古都西安数字化转型
  10. 腾讯携手教育部教指委、中国信通院发布犀牛鸟开源人才培养计划