地震高岗,一派溪山千古秀;面试
门朝大海,三河合水万年流;浏览器
没错,这正是《鹿鼎记》天地会的接头暗号。网络
天地会为何须要接头暗号呢?并发
假设天地会赤火堂香主派人从京城前扬州将一封很是重要的密函交给青木堂香主韦小宝,咱们能够将这件事抽象为下图:工具
这件事的核心是帮派成员-甲将重要密函交给帮派成员-乙。假设甲、乙双方互不相识亦从未有过会面,那帮派成员-甲如何排判断密函交给了帮派成员-乙,而不是给错人——给了其余帮派成员-丁呢?网站
在历史实践中确定吃过这样的亏,遂天地会采用了接头暗号这种方式来确保甲、乙双方是同一帮派成员,这才有了:加密
地震高岗,一派溪山千古秀;spa
门朝大海,三河合水万年流;操作系统
暗号只有帮派成员才知道,且不可外泄。甲、乙双方见面时由帮派成员-甲说出地震高岗,一派溪山千古秀,帮派成员-乙听到后必须接下一句门朝大海,三河合水万年流。若是帮派成员-乙不知道下一句是什么,或者胡说一气,那么帮派成员-甲就能够断定他不是接头人,而是冒充的。3d
一样的,帮派成员-乙要听到帮派成员-甲说出地震高岗,一派溪山千古秀。不然帮派成员-甲就是冒充的,颇有可能会将假的密函交给青木堂韦小宝。
天地会接头人互相传递消息(密函)很像是咱们在开发 WEB 应用时的 Client 和 Server,抽象地看起来像这样:
那么问题来了,Client 和 Server 之间需不须要天地会这样的暗号呢?
答案是须要!
Client 就像帮派成员-甲,Server 就像帮派成员-乙,而他们的密函颇有可能会被其余帮派成员-丁拿走或伪造。既然天地会有接头暗号,那么 Client 和 Server 之间用什么来保障传递消息是第一手发出,而不是被拦截伪造的呢?
没错,签名验证!
签名验证是目前 IT 技术领域应用普遍的 API 接口数据保护方式之一,它可以有效防止消息接收端将被篡改或伪造的消息看成正常消息处理。
⚠️要注意的是,它的做用防止消息接收端将被篡改或伪造的消息看成正常消息处理,而不是防止消息接受端接收假消息,事实上接口在收到消息的那一刻没法判断消息的真假。这一点很是重要,千万不要混淆了。
假设 Client 要将下个月 5 号刺杀鳌拜这封重要密函交给 Server,抽象图以下:
这时候若是发生冒充事件,会带来什么影响:
其余帮派成员-丁从 Client 那里得到消息后进行了伪造,将刺杀鳌拜的时间从 5 号改成 6号,致使 Server 收到的刺杀时间是 6 号。这么一来,内外夹攻刺杀鳌拜的事就会变成一方延迟动手,此次谋划已久的刺杀行动大几率会失败,并且会形成不小的损失。
咱们使用签名验证来改善这个消息传递和验证的事,这里能够简单将签名验证理解为在原消息的基础上进行必定规则的运算和加密,最终将加密结果放到消息中一并发送,消息接收者拿到消息后按照相同的规则进行运算和加密,将本身运算获得的加密值和传递过来的加密值进行比对,若是两值相同则表明消息没有被拦截伪造,反之能够断定消息被拦截伪造。
这里咱们经过实际网站中的例子来加深理解,打开 http://www.porters.vip/verify... ,网页以下图所示:
鼠标点击图片中黄色的按钮——点击查看详情,此时网页内容产生变化,页面以下图所示:
为了观察和分析,咱们唤起浏览器内置的开发者工具(快捷键 F12 或 Command+Option+I)并切换到 Network 面板。此时刷新页面,并再一次点击黄色按钮。点击后咱们会在 Network 面板中看到不少网络请求记录,其中有一条 Name 很长的请求,点击它。
点击它后 Network 面板将会分为左右两栏,左侧依旧是请求记录,右侧是咱们选中的请求记录的请求详情。咱们选中的这条网络请求信息以下图所示:
从 General 和 Query String Parameters 中咱们得知本次向 http://www.porters.vip/verify... 接口发出的请求中携带了 actions、tim、randstr 和 sign 等 4 个参数。这里的 sign 字段和对应的值就是签名验证中的签名,即通过必定规则运算和加密的值。
若是没有 sign,Client 只将 actions、tim 和 randstr 发送给 Server,那么帮派成员-丁能够很轻松地伪造一条消息发送给 Server,例如:
Server 收到后就看成正常的消息处理,根本无从判断消息是谁发的,有没有被拦截、篡改。那么问题来了:sign 在这里发挥了什么做用呢?
假设 sign 的运算规则为:
sign = MD5(str(actions + 10086) + str(tim) + randstr * 3)
Client 中设定的这个运算规则至关于接头暗号中的上半句地震高岗,一派溪山千古秀,而 Server 端拿到 actions、tim、randstr 和 sign 以后,用相同的运算规则计算 new_sign 的值,最后判断 Client 发送的 sign 和 Server 本身计算的 new_sign 是否一致,看起来像这样:
new_sign = MD5(str(actions + 10086) + str(tim) + randstr * 3)
固然,这里的交互只是单向的,Server 端没必要将门朝大海,三河合水万年流回复给 Client(其实能够这么作,但在网络通讯中没有必要)。就算其余帮派成员-丁拦截到消息,并进行了篡改也不会对 Server 形成影响,由于其余帮派成员-丁并不知道 sign 是如何运算的,他篡改后的的数据计算出的 new_sign 和收到的 sign 是不一样的,所以 Server 可以区分真假消息并丢弃假消息。
有了接头暗号后,消息接收方 Server 就不用担忧拿到的是假密函了。
签名验证被普遍应用,例以下载操做系统镜像文件时官方网站会提供文件的 MD5 值、阿里巴巴/腾讯/华为等企业对外开放的接口中鉴权部分的 sign 值等。
本文改编自《Python3 反爬虫原理与绕过实战》第 4 章第 3 小节,这本书是爬虫领域第一本专门介绍反爬虫的书,从“攻”与“防”两个角度描述了爬虫技术与反爬虫技术的对抗过程,并详细介绍了这其中的原理和具体实现方法。经过这本书,你将了解到签名验证、文本混淆、动态渲染、加密解密、代码混淆和行为验证码等反爬虫技术的成因和绕过方法。书本中介绍到的反爬虫知识覆盖了市面上 90% 以上的反爬虫手段知识点,很是硬核。
掌握这些知识后,你的理论基础将很是扎实,可以轻松应对一线大厂中高级爬虫工程师面试的理论和思路问题。实战方面,除了本书搭建的21个在线练习示例以外,还须要结合工做中遇到的综合反爬虫进行演练,从而稳步提高我的技术实力。
⏰ 本文使用的示例网站 http://www.porters.vip/verify... 正是书中 21 个在线练习示例其中的一个。
本书在预售阶段销量就超过了1000本,第一批出版后被广大工程师一抢而空,当即申报了第二批印制,因而可知火爆程度。
本书参与了京东图书 5 折活动,现价只须要44.5元,快去抢购吧!