1、首先總結一下數字簽名的使用規則和相關流程
講解比較詳細的網絡日志可以參考:這里以及這里,我這里只做一些自己的總結。
一般來說現在的加密領域或者是認證體系中,都是在使用雙秘鑰:公鑰和私鑰,其中公鑰用來加密信息,私鑰用來數字簽名。任何人都可以生成自己的(公鑰,私鑰)對,所以為了防止有人散布偽造的公鑰騙取信任,就需要一個可靠的第三方機構來生成經過認證的(公鑰,私鑰)對。
私鑰是本人所持有的,不對外公布,公鑰是公布給他人的。一對密鑰,使用一個加密,必定可以使用另一個進行解密。
一般情況下,數字簽名以及驗證的流程為:
首先對於要傳輸的原文,使用HASH計算(一般是SHA1或SHA2),可以得到原文摘要,然后本人使用私鑰將原文摘要進行加密,此密文即為傳輸過程中的簽名;
接收者收到傳輸數據后,需要對內容進行驗證,查看內容是否為原文,是否被篡改,使用公鑰對簽名進行解密,得到原文摘要,然后自己在本地也對取得的當前原文進行HASH計算,得到當前原文的摘要,將解密得到的摘要與自己計算得到的摘要進行比對,查看是否一致即可驗證。
以上為本人--->接收者的過程,反過來接收者--->本人的過程與此相反,即使用公鑰進行加密的過程。
需要注意兩點:
1、整個過程中是對原始為篡改原文的摘要進行加密和解密,本地都會進行取得數據的文件摘要的計算,並且與解密出來的摘要進行比對后得出驗證結論。
2、當需要驗證的文件多了,就需要保存非常多的公鑰,就無法管理了,並且本地保存的公鑰有可能被篡改替換。為了解決這一問題就需要一個統一的證書管理機構來管理所有需要發送數據方的公鑰,對公鑰進行認證和加密。這個機構也就是我們常說的CA。認證加密后的公鑰,即是證書,又稱為CA證書,證書中包含了很多信息,最重要的是申請者的公鑰。
這樣就對於整個過程又添加了一步包裝,申請者使用證書發送數據時,用自己的私鑰生成簽名,將簽名、 證書和發送內容一起發給對方,對方拿到了證書后,需要對證書解密以獲取到證書中發送方的公鑰,解密需要用到CA機構的”統一密鑰對“中的公鑰,這個公鑰也就是我們常說的CA根證書,通常需要我們到證書頒發機構去下載並安裝到相應的收取數據的客戶端,如瀏覽器上面。這個公鑰只需要安裝一次。有了這個公鑰之后,就可 以解密證書,拿到發送方的公鑰,然后解密發送方發過來的簽名,獲取摘要,重新計算摘要,作對比,以驗證數據內容的完整性。
驗證簽名的是否有效,通常是先算“摘要”, 再以摘要和公鑰作為輸入,調用驗證算法來驗證(verify)簽名是否有效。而不是先驗證簽名(即題主所說的公鑰解密),再算摘要來比對。
你只要想:既然是加密,那肯定是不希望別人知道我的消息,所以只有我才能解密,所以可得出公鑰負責加密,私鑰負責解密;同理,既然是簽名,那肯定是不希望有人冒充我發消息,只有我才能發布這個簽名,所以可得出私鑰負責簽名,公鑰負責驗證。
2、HTTPS協議實例
此協議主要是用於網頁的加密傳輸,瀏覽器向服務器發出訪問請求,該請求是以https協議來進行的,那么服務器在接收到請求后就使用私鑰加密網頁,連同自己本身的數字證書一起發送給瀏覽器客戶端,而瀏覽器的"證書管理器"中有"受信任的根證書頒發機構"列表,客戶端會根據這張列表,查看解開數字證書的公鑰是否在列表之內。
當證書可能被冒用,瀏覽器會發出警告,或者如果這張數字證書不是由受信任的機構頒發的,瀏覽器會發出另一種警告。
如果數字證書是可靠的,客戶端就可以使用證書中的服務器公鑰,對信息進行加密,然后與服務器交換加密信息。
3、進階總結以及若干問題
綜合上面的過程,需要考慮一下,數字簽名的偽造問題,參考這里
- 1. 原文被篡改
肯定是能檢驗出來的,直接公鑰解密數字簽名取得哈希值,對比原文的哈希即可驗證。
- 2. 數字簽名被篡改
這也肯定不可能,公鑰解密被篡改的數字簽名后得到的哈希值(因為加解密算法是公開的,應該能找到一種辦法做出一種假的(至上看上去)哈希值)和原文的哈希也對不上
- 3. 兩者皆被篡改
公鑰解密被篡改后的數字簽名后得到了假的哈希值,然后用彩虹表搞出原文,這時候,原文的哈希和假哈希一樣了,理論上可行,但可能性不大!
理論上來說,有下面兩種典型的攻擊:
1. 找與“舊”原文摘要值相同的原文,等價於攻擊hash算法,找出碰撞。如使用題主提到的用彩虹表或者其他的手段。
2. 直接偽造數字簽名。
4、哈希碰撞來偽造數字證書
1中的相關描述可以用一幅流程圖來展示:

其中一個重點算法過程就是哈希運算,而其他的加密解密都是使用固定好的數據來進行,如果要對數字簽名進行偽造,這里哈希運算的過程是第一個可以進行利用的。
獲得簽名證書一般有幾種途徑:
1、證書頒發機構購買證書(獲得的是原始真實證書)
2、竊取CA的私鑰(就可以自行添加指定的證書對,就相當於自己是認證機構,可以為所欲為了,但這個是非常非常困難的)
3、偽造一個同可信證書具有相同哈希值的證書(隨着硬件性能的增強,此方法已經是可行的了)
偽造的思路就是:

就是你找到一個跟簽名消息具有相同哈希值的消息,你就可以替換原有的消息,而最終驗證簽名也不會出錯。這就可以用來偽造任何人簽署他們本沒有簽署過的消息。
其實說到這里這個議題就變成了密碼破解了,比如MD5密碼破解等等。
5、密碼函數碰撞
方法是使用運用選擇前綴碰撞法,找出兩個具有相同MD5值的文件,2008年,一些研究人員(包括Marc Stevens和Alex Sotirov)使用選擇前綴碰撞法偽造了一個受瀏覽器信任的證書。其POC在2008年的混沌通信大會上面進行了展示,而為了得到這個POC研究人員也僅花了幾天的計算時間。
2012年,一個名為Flame的惡意軟件被發現。Flame能通過劫持微軟Windows Update服務來感染計算機。當時,Windows Update驗證更新文件正是通過驗證文件基於MD5數字簽名得到的數字證書。Flame的作者偽造了微軟的數字證書。通過對偽造證書的分析,發現作者很有可能就是基於選擇前綴碰撞技術偽造的證書。
