每個(gè)人都下載文件,大家有沒有想過,文件可能是假的,尤其來自網(wǎng)盤或?qū)iT的下載站。
本文就來談?wù)勅绾巫R(shí)別文件的真假。
一、XcodeGhost 事件
我們從一件真實(shí)的事件說起。
2015 年 9 月,蘋果手機(jī)的一些 App 被發(fā)現(xiàn)[1]向可疑網(wǎng)站發(fā)送數(shù)據(jù)。進(jìn)一步調(diào)查確認(rèn),可疑代碼是 Xcode 打包時(shí)植入的。也就是說,開發(fā)者的編程工具 Xcode 被動(dòng)過手腳了。
騰訊的安全團(tuán)隊(duì)公布調(diào)查報(bào)告[2],應(yīng)用商店的前 5000 名應(yīng)用有 76 個(gè)被感染。360 應(yīng)用商店檢查后發(fā)現(xiàn)[3],共有 1076 個(gè) App 被感染,包括微信、網(wǎng)易云音樂、滴滴打車、高德地圖、12306、同花順等熱門應(yīng)用。蘋果公司將所有被感染的版本,都從官方軟件商店下架了。這個(gè)事件就稱為 XcodeGhost 事件[4]。
國家互聯(lián)網(wǎng)應(yīng)急中心專門發(fā)出了預(yù)警通知。
追查下去,那些動(dòng)過手腳的 Xcode 都不是從官方渠道下載的,而是來自網(wǎng)盤或下載站。一個(gè)網(wǎng)名“coderfun”的人,在各種 iOS 開發(fā)者論壇或者微博留言,引誘其他開發(fā)者下載修改過的 Xcode,版本從 Xcode 6.1 到6.4。
事后,這位 coderfun 發(fā)出致歉公告,表示這只是自己的一次實(shí)驗(yàn),沒有惡意。但是,這個(gè)事件足以引起警惕,任何下載的文件都不一定安全,很可能被修改過或植入惡意代碼。
二、軟件的防偽措施
為了防止來源不明的軟件,很多平臺(tái)都有簽名機(jī)制。軟件發(fā)布必須由認(rèn)證過的開發(fā)商,使用平臺(tái)的密鑰簽名。如果用戶安裝未簽名的軟件,平臺(tái)會(huì)彈出警告,阻止安裝。下面就是 MacOS 的警告。
但是,不可能所有開發(fā)者都去認(rèn)證,尤其是認(rèn)證要收費(fèi)。而且,用戶對這種警告不在乎,一般都會(huì)忽略或手動(dòng)關(guān)閉。所以,這種做法的效果不明顯。
目前的常用做法是,軟件發(fā)布時(shí),同時(shí)給出哈希碼和簽名文件。前者保證沒有被第三方修改,后者保證確實(shí)出自原始作者。
舉例來說,Linux 的發(fā)行版 Manjaro 除了提供原始的 iso 文件,還提供另外三個(gè)文件:sha1 哈希文件、sha 256 哈希文件和 sig 簽名文件。它們保證了軟件的真實(shí)性。
三、哈希碼驗(yàn)證
哈希碼指的是,文件內(nèi)容經(jīng)過哈希函數(shù)的計(jì)算,會(huì)返回一個(gè)獨(dú)一無二的字符串。哪怕原始內(nèi)容只改動(dòng)一個(gè)字節(jié),哈希碼也會(huì)完全不同。用戶下載軟件后,只要計(jì)算一下哈希碼,再跟作者給出的哈希碼比較一下,就會(huì)知道軟件有沒有被改動(dòng)。
目前,常用的三種哈希函數(shù)是 MD5、SHA1 和 SHA256。其中,SHA256 最安全,SHA1 次之,MD5 墊底。一般來說,軟件至少會(huì)提供其中一種哈希碼。
下面是哈希碼的驗(yàn)證方法。
(1)Linux 系統(tǒng)
Linux 系統(tǒng)直接用md5sum、sha1sum、sha256sum這三個(gè)命令,計(jì)算哈希碼。
$ md5sum foo.zip $ sha1sum foo.zip $ sha256sum foo.zip
上面命令返回文件foo.zip的三種哈希碼。用戶再跟作者給出的哈希碼比對。如果不一致,文件就是被改動(dòng)了,或者沒有完整下載。
有時(shí),就像前面 Manjaro 的例子,哈希碼不是寫在網(wǎng)頁上,而是作為一個(gè)單獨(dú)的文本文件下載。這時(shí)可以使用-c參數(shù)。
$ md5sum -c foo.zip.md5file $ sha1sum -c foo.zip.sha1file $ sha256sum -c foo.zip.sha256file
上面命令會(huì)返回哈希碼的比對結(jié)果,直接告訴用戶是否一致。
(2)Mac 系統(tǒng)
MacOS 的驗(yàn)證命令需要自己安裝。
$ brew install md5sha1sum
執(zhí)行上面命令以后,md5sum和sha1sum就可以使用了。至于sha256sum要用shasum -a256命令代替。
(3)Windows 系統(tǒng)
Windows 可以下載安裝免費(fèi)軟件 Quick hash[5]或者 Raymond’s MD5 & SHA Checksum Utility[6]。其中,Quich hash 是跨平臺(tái)的,還支持 Linux 和 MacOS。
四、簽名驗(yàn)證
哈希碼只能保證文件內(nèi)容沒有修改,但是哈希碼本身也有可能仿冒,完全可能連帶原始文件一起造假。
文件簽名能解決這個(gè)問題。軟件發(fā)布時(shí),作者用自己的私鑰,對發(fā)布的軟件生成一個(gè)簽名文件(Manjaro 例子的 sig 文件),用戶使用作者的公鑰驗(yàn)證簽名文件。
第一步,下載公鑰。
軟件的官網(wǎng)一般都會(huì)給出作者公鑰的下載方法。比如,Manjaro 就可以從 GitHub 倉庫下載公鑰。
$ wget github.com/manjaro/packages-core/raw/master/manjaro-keyring/manjaro.gpg
公鑰也有可能放在專門的公鑰服務(wù)器,這時(shí)可以使用gpg命令在從公鑰服務(wù)器下載。
$ gpg --keyserver hkp://eu.pool.sks-keyservers.net --search-keys [公鑰 ID]
上面命令會(huì)列出搜索結(jié)果,讓你選擇是否下載某一個(gè)公鑰。--keyserver參數(shù)指定公鑰服務(wù)器,search-keys參數(shù)給出搜索參數(shù),可以是作者的名稱,也可以是公鑰的指紋。
gpg命令在 Linux 下可以直接使用,MacOS 和 Windows 需要安裝 GnuPG[7]。
第二步,導(dǎo)入公鑰。
下載得到公鑰后,將其導(dǎo)入操作系統(tǒng)。
$ gpg --import [公鑰文件]
如果有完整的公鑰指紋,gpg命令的--recv-key參數(shù)可以直接從服務(wù)器導(dǎo)入公鑰。
$ gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-key "27DE B156 44C6 B3CF 3BD7 D291 300F 846B A25B AE09"
第三步,驗(yàn)證簽名。
導(dǎo)入公鑰以后,就可以驗(yàn)證簽名文件(后綴名為sig的 文件)了。
# 用法一 $ gpg --verify [簽名文件] # 用法二 $ gpg --verify [簽名文件] [原始文件]
上面命令的兩種用法,效果是一樣的。但是,用法一要求原始文件與簽名文件同名,且在一個(gè)目錄下。比如,簽名文件是foo.iso.sig,原始文件必須是同目錄下的foo.iso。
簽名文件一般包括完整的公鑰指紋,所以也可以跳過上面的第一步和第二步,直接從公鑰服務(wù)器獲取公鑰,驗(yàn)證簽名。
$ gpg --keyserver-options auto-key-retrieve --verify [簽名文件]
-
Linux
+關(guān)注
關(guān)注
87文章
11212瀏覽量
208721 -
APP
+關(guān)注
關(guān)注
33文章
1566瀏覽量
72334 -
iOS
+關(guān)注
關(guān)注
8文章
3393瀏覽量
150368
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論