地震高崗,一派溪山千古秀;面試
門朝大海,三河合水萬年流;瀏覽器
沒錯,這正是《鹿鼎記》天地會的接頭暗號。bash
天地會爲何須要接頭暗號呢?網絡
假設天地會赤火堂香主派人從京城前揚州將一封很是重要的密函交給青木堂香主韋小寶,咱們能夠將這件事抽象爲下圖:併發
這件事的核心是幫派成員-甲將重要密函交給幫派成員-乙。假設甲、乙雙方互不相識亦從未有過會面,那幫派成員-甲如何排判斷密函交給了幫派成員-乙,而不是給錯人——給了其餘幫派成員-丁呢?工具
在歷史實踐中確定吃過這樣的虧,遂天地會採用了接頭暗號這種方式來確保甲、乙雙方是同一幫派成員,這纔有了:網站
地震高崗,一派溪山千古秀;ui
門朝大海,三河合水萬年流;加密
暗號只有幫派成員才知道,且不可外泄。甲、乙雙方見面時由幫派成員-甲說出地震高崗,一派溪山千古秀,幫派成員-乙聽到後必須接下一句門朝大海,三河合水萬年流。若是幫派成員-乙不知道下一句是什麼,或者胡說一氣,那麼幫派成員-甲就能夠斷定他不是接頭人,而是冒充的。spa
一樣的,幫派成員-乙要聽到幫派成員-甲說出地震高崗,一派溪山千古秀。不然幫派成員-甲就是冒充的,頗有可能會將假的密函交給青木堂韋小寶。
天地會接頭人互相傳遞消息(密函)很像是咱們在開發 WEB 應用時的 Client 和 Server,抽象地看起來像這樣:
那麼問題來了,Client 和 Server 之間需不須要天地會這樣的暗號呢?
答案是須要!
Client 就像幫派成員-甲,Server 就像幫派成員-乙,而他們的密函頗有可能會被其餘幫派成員-丁拿走或僞造。既然天地會有接頭暗號,那麼 Client 和 Server 之間用什麼來保障傳遞消息是第一手發出,而不是被攔截僞造的呢?
沒錯,簽名驗證!
簽名驗證是目前 IT 技術領域應用普遍的 API 接口數據保護方式之一,它可以有效防止消息接收端將被篡改或僞造的消息看成正常消息處理。
⚠️要注意的是,它的做用防止消息接收端將被篡改或僞造的消息看成正常消息處理,而不是防止消息接受端接收假消息,事實上接口在收到消息的那一刻沒法判斷消息的真假。這一點很是重要,千萬不要混淆了。
假設 Client 要將下個月 5 號刺殺鰲拜這封重要密函交給 Server,抽象圖以下:
這時候若是發生冒充事件,會帶來什麼影響:
其餘幫派成員-丁從 Client 那裏得到消息後進行了僞造,將刺殺鰲拜的時間從 5 號改成 6號,致使 Server 收到的刺殺時間是 6 號。這麼一來,內外夾攻刺殺鰲拜的事就會變成一方延遲動手,此次謀劃已久的刺殺行動大機率會失敗,並且會形成不小的損失。
咱們使用簽名驗證來改善這個消息傳遞和驗證的事,這裏能夠簡單將簽名驗證理解爲在原消息的基礎上進行必定規則的運算和加密,最終將加密結果放到消息中一併發送,消息接收者拿到消息後按照相同的規則進行運算和加密,將本身運算獲得的加密值和傳遞過來的加密值進行比對,若是兩值相同則表明消息沒有被攔截僞造,反之能夠斷定消息被攔截僞造。
這裏咱們經過實際網站中的例子來加深理解,打開 www.porters.vip/verify/sign… ,網頁以下圖所示:
鼠標點擊圖片中黃色的按鈕——點擊查看詳情,此時網頁內容產生變化,頁面以下圖所示:
爲了觀察和分析,咱們喚起瀏覽器內置的開發者工具(快捷鍵 F12 或 Command+Option+I)並切換到 Network 面板。此時刷新頁面,並再一次點擊黃色按鈕。點擊後咱們會在 Network 面板中看到不少網絡請求記錄,其中有一條 Name 很長的請求,點擊它。
點擊它後 Network 面板將會分爲左右兩欄,左側依舊是請求記錄,右側是咱們選中的請求記錄的請求詳情。咱們選中的這條網絡請求信息以下圖所示:
從 General 和 Query String Parameters 中咱們得知本次向 www.porters.vip/verify/sign… 接口發出的請求中攜帶了 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)
if new_sign == sign:
print("不是假消息")
else:
print("這是假消息")
複製代碼
固然,這裏的交互只是單向的,Server 端沒必要將門朝大海,三河合水萬年流回覆給 Client(其實能夠這麼作,但在網絡通訊中沒有必要)。就算其餘幫派成員-丁攔截到消息,並進行了篡改也不會對 Server 形成影響,由於其餘幫派成員-丁並不知道 sign 是如何運算的,他篡改後的的數據計算出的 new_sign 和收到的 sign 是不一樣的,所以 Server 可以區分真假消息並丟棄假消息。
有了接頭暗號後,消息接收方 Server 就不用擔憂拿到的是假密函了。
簽名驗證被普遍應用,例以下載操做系統鏡像文件時官方網站會提供文件的 MD5 值、阿里巴巴/騰訊/華爲等企業對外開放的接口中鑑權部分的 sign 值等。
本文改編自《Python3 反爬蟲原理與繞過實戰》第 4 章第 3 小節,這本書是爬蟲領域第一本專門介紹反爬蟲的書,從「攻」與「防」兩個角度描述了爬蟲技術與反爬蟲技術的對抗過程,並詳細介紹了這其中的原理和具體實現方法。經過這本書,你將瞭解到簽名驗證、文本混淆、動態渲染、加密解密、代碼混淆和行爲驗證碼等反爬蟲技術的成因和繞過方法。書本中介紹到的反爬蟲知識覆蓋了市面上 90% 以上的反爬蟲手段知識點,很是硬核。
掌握這些知識後,你的理論基礎將很是紮實,可以輕鬆應對一線大廠中高級爬蟲工程師面試的理論和思路問題。實戰方面,除了本書搭建的 21 個在線練習示例以外,還須要結合工做中遇到的綜合反爬蟲進行演練,從而穩步提高我的技術實力。
⏰ 本文使用的示例網站 www.porters.vip/verify/sign… 正是書中 21 個在線練習示例其中的一個。
本書在預售階段銷量就超過了 1000 本,第一批出版後被廣大工程師一搶而空,當即申報了第二批印製,因而可知火爆程度。
本書參與了京東圖書 5 折活動,現價只須要 44.5 元,快去搶購吧!