首頁>科技>

某知名論壇看到一篇很好的文章,言簡意賅,三言兩語就掃清了我的一塊知識盲區,為記錄並反覆溫故知新,就轉載到自己的賬號下。如有冒犯原著作者,請聯絡我。

原文如下:前言

近日,由於專案需要,再次讓我碰到了這個名為:Signature的數字簽名演算法,因之前曾有網友私聊我某站的sig(Signature的簡稱,亦可能為sign)怎麼還原它的演算法,所以我想打算就此寫一篇文章並分享下它的加密過程以及除錯思路,注:本文僅限於學術交流之用,並未特地針對某站或涉嫌任何非法操作的行為,請自行斟酌。

Digital Signature是什麼?

譯為:數字簽名,我們可以想象一下,在一個沒有電腦、也沒有手機的遠古時代裡,人們日常互動均採用書信的形式,它們往往在郵遞/傳送信件給好友之前,都會在署上自己的資訊,茲以證明該信件是由自己送出的。

而由於當時的科技非常落後,可以說非常輕鬆就可以偽造出一封攜帶某人署名的信件,而接收者也無從分辨是否源於本人的信件,受害者往往會因此而上當受騙,在這個科技發達的時代裡,新的簽名方式誕生了,它撇開以往的書寫習慣,而採用數字化運算來實現,現代化的數字簽名是由基於RAS非對稱協議加密技術 (公鑰+私鑰組成),公鑰加密,私鑰解密,理論上,只要私鑰持有者不外洩私鑰,別人是沒法進行簽名偽造的,也就是說當信件落到別人的手裡,只要對方沒有私鑰,它就無法檢視信件裡的東西從而起到了安全的防護作用。

Signature的組成

在了解了數字簽名後,是時候該來探討下 Signature的演算法了,那麼我們常見的sig、sign、或直接就是signature演算法與簽名的數字簽名有啥區別嗎?

事實上, 它們都是一種數字簽名,為防止資料被第三方篡改從而加入的一種網站自我保護措施,不過通常它們在加密前會對摘要進行一次或者多次的Hash運算後才進行RSA加密的,就目前遇到的sig類的加密演算法來看,基本上都是由:(摘要(可以是某欄位、data、密碼或url的部分欄位) + Cookie的某欄位或userid之類的欄位 + 時間戳 )然後對其進行Hash運算(md5或者是Aes均有),得到hash值後再對其進行數字簽名運算(部分站點還對密文進行Base64加密)最終取得所謂的sign值。

關於Sign的誤區

看到這裡可能大家會有個疑問了,不是說數字簽名只有私鑰持有者才能解密嗎,那麼那些爬蟲是如何得到資料的?

關於這個,我覺得很有必要給大家普及一下,首先,我們知道想要生成一份數字簽名,你需要兩個key(公鑰與私鑰),一個是網站端的,一個是分發給瀏覽器的,無論哪一方進行的加密,另一端只要有私鑰,就能解讀內容,而這個“瀏覽器”便是我們的契機,熟悉前端演算法的大佬們,可以通過逆向目標站點的JS取得用於加密/解密的一串唯一的key,雖然這個key不是給我們的,但是誰能攔得住你去“偷”啊,偷人家的東西尚且屬於違法的,但偷自己的呢?(啊哈哈…..這就有點尷尬了)所以那些爬蟲能得到資料是因為它們拿到了私鑰,懂了吧!

Sign加密演算法入口定位

一般來說要找到簽名演算法的入口大部分也算較為簡單的,先不說入口,我們單從特性來講,它們基本都是由hash + rsa組成,所以我們找到入口後,基本上可以說已經完成80%的解密了,至於如何定位入口,可以使用快速定位法(關鍵字、xhr斷點、hook)等形式,具體可以參考我往期的文章。前面已經說了,本篇文章不涉及針對任何網站採取任何破壞形式,所以這裡就不給大家做演示,基本上遵循以上的法則基本可以取得加密演算法,但有一種情況除外,那就是APP的,對於APP我建議大家先到網頁端分析一下是否也有該欄位,如果有,大可直接從網頁端研究,否則,可能需要從app逆向開始啦,最後祝大家好運!

最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 華為emui10.1很酷