信息的保密和認證(2) ————不能被篡改!

話說上次[1]本幽靈開了個頭,大體聊了聊信息傳遞時可能遭到的攻擊以及數字簽名是怎麼回事情,這次就來聊聊如何防止信息不被篡改。

上次已經說過了,單純的加密是無法防止信息被篡改的,攻擊者大可以在密文裡增加刪除字符或者改變密文順序或者進行重放攻擊,還可以直接冒充通信雙方中的其中一方來釣魚。啊,對了,還可以進行中間人攻擊[2]呢。

特別是下載的時候,總是有不懷好意的傢伙篡改程序,在其中植入病毒,然後很多人就會遭殃。例如牆內流傳的那些翻牆軟件,就有不少人中招過,第三方下載網站多數都很不靠譜。

那麼,直接去官網下載?這又要看情況:如果說官網支持HTTPS[3],那一般沒問題(前提是不被中間人攻擊,請排除一些狗屁證書[4]),攻擊者沒法中間人或釣魚也不太好下手(如果隨意加入木馬程序,那很可能會直接損壞原軟件,到時就露餡了),但也不是萬無一失的;如果說官網不支持HTTPS,那麼攻擊者可以在下載過程中輕易植入木馬,這樣就沒有安全性了。

那麼,該如何保證下載下來的軟件不被篡改呢?

有人應該注意到了,像自由門無界還有賽風三都是有數字簽名的,只要右鍵屬性然後查看數字簽名就可以確定下載下來的程序有沒有問題了。上次聊數字簽名的時候重點放在介紹數字簽名是如何防止通信雙方中的一方賴賬的了,其實數字簽名還可以用來防止信息被篡改,不過要配合上證書(下一篇我會仔細講講數字證書)就是了。(這裡再多句嘴,win自帶的基於證書的數字簽名信息防篡改系統是一個系統,有些人聽說過的GPG[5]簽名是另一個防篡改系統,它們之間是相互獨立的)

哈,諸位看到這裡可能有些糊塗了,應該很好奇防篡改的原理是什麼吧。

問諸位一個問題:該如何保證下載下來的軟件就是官網上的那個軟件呢?

不管是什麼軟件,實質就是一堆二進制編碼,如果軟件被篡改了,那麼它的二進制編碼一定會發生變化。“那麼,我們可以在官網上公佈每個軟件的二進制編碼,然後用戶可以先在軟件幫助下計算出二進制編碼,再去官網進行比對。”

聽起來好像不錯,問題在於二進制編碼的單位是bit,而以賽風三為例,大小是2.59 MB (2,721,896 字節),請注意1Byte=8bit,所以請自行想像這段數字會有多長,要在官網上寫上多少頁。如果是Tor Browser的話,那就更加糟糕(大小33.0 MB (34,694,627 字節))。我的天,這還有可操作性?手動比對?就算是在軟件幫助之下自動比對,那複製粘貼的活兒也會讓人發瘋的!還有就是,那一大堆01看上去都差不多的,很容易看昏頭的。

那麼該怎麼辦?

“既然直接對比那長死人的二進制編碼不現實,那麼我們可以想辦法找到這樣一種函數,輸入一個二進制編碼,就能得到一個簡短的結果,然後只要對比官網上的結果即可。”

這種函數需要滿足以下條件:
1,輸入二進制編碼,就能夠很輕鬆的就算出結果(太複雜的話,CPU吃不消的,相應的算法也很難設計);

2,第三方根據算出的結果,無法逆向算出對應的二進制編碼(可以用來防止賴賬,在確認結果屬於A的情況下,就可以進一步確認對應的二進制編碼也是A的)

3,無法找到一個不同的二進制編碼使得兩個二進制編碼得出的結果相同(很重要,如果說可以多對一的話,那麼就無法保證程序沒有被篡改了)

4,二進制編碼中一個比特被改變了,就會導出完全不同的結果(也很重要,要是看上去差不多,那就又會有很多不肯仔細核對的糊塗蟲被攻擊者欺騙)

這種函數,就是大名鼎鼎的hash(散列)函數,而根據散列函數設計的算法就叫做散列算法,常見的有:MD5,SHA1,SHA256,SHA512,CRC32等,數據鏈路層中檢測幀是否有錯誤的時候用的就是CRC32(32位的循環冗餘校驗算法)。而散列算法輸出的結果被稱作message digest(報文摘要),SHA1的報文摘要是160位,SHA256就是256位,不過一般情況下並不寫成01的形式(因為還是太長了啊),而是把這堆01轉換為16進制。順便說一句,SHA是Secure Hash Algorithm(安全散列算法)的縮寫,是最常用的散列算法標準之一。

實際上,前面提到的“確認下載下來的軟件沒被篡改”只是散列算法的應用場景之一而已,只要通信雙方想要保證傳遞的信息不被篡改,都可以用散列算法在信息發送前計算出報文摘要,然後單獨傳遞給對方,對方收到之後再手動計算收到的信息的報文摘要進行比對以確認信息是否被篡改。

這樣諸位下載軟件的時候就可以安心了,就以I2P為例,首先去I2P官網[6]下載I2P程序,下載完成之後,就打開hash計算程序[7]計算出下載來的文件的message digest,然後再和官網上給出的message digest進行比對,如果一致就說明沒有問題了,文件沒有被篡改。

不過世界上沒有完美的算法。前面提到散列算法需要做到“無法找到一個不同的輸入使得輸出相同‘,但實際上不存在完全做到這一點的算法(就好像沒有加密算法能做到產生完全的隨機數一樣)。如果說出現了兩個或以上不同輸入的輸入得出相同輸出的情況,那就說明這個散列函數發生碰撞了。一旦攻擊者能夠輕鬆做到實現碰撞,那麼對應的散列算法就被廢掉了。

很不幸的是,MD5已經不安全了,已經有人發現了可行度很高的碰撞實現方法,CRC32更是早就不可靠了。而隨著CPU計算能力的提升,SHA1很快也會變得不安全,SHA256和SHA512倒是還能堅挺一段時間。

差不多了,下次聊聊證書吧!

科普文鏈接集合:https://plus.google.com/109790703964908675921/posts/TpdEExwyrVj

參考資料:
1,信息的保密和認證(1)
https://plus.google.com/109790703964908675921/posts/fuKwSFikxei 2,(基礎知識)SSL/TLS的原理以及互聯網究竟是如何工作的(4)
————中間人攻擊,當心!
https://plus.google.com/109790703964908675921/posts/3U3iMGDNZiB 3,(基礎知識)SSL/TLS的原理以及互聯網究竟是如何工作的(3)
————TLS的專場!
https://plus.google.com/109790703964908675921/posts/NwWoGQ9mcDY 4,強力推薦把共匪數字證書轟出去的程序:RevokeChinaCertshttps://plus.google.com/109790703964908675921/posts/TzsdGi9NZQw 5,https://en.wikipedia.org/wiki/GNU_Privacy_Guard 6,https://geti2p.net/en/ 7,https://code.google.com/p/fhash/http://allinfa.com/sha1-md5-hashjet-v14.html

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *