慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
如何識別文件的真假
阮一峰 · 2019-11-26 · via 阮一峰的网络日志

每個人都下載文件,大家有沒有想過,文件可能是假的,尤其來自網盤或專門的下載站。

本文就來談談如何識別文件的真假。

一、XcodeGhost 事件

我們從一件真實的事件說起。

2015年9月,蘋果手機的一些 App 被發現向可疑網站發送數據。進一步調查確認,可疑代碼是 Xcode 打包時植入的。也就是說,開發者的編程工具 Xcode 被動過手腳了。

騰訊的安全團隊公佈調查報告,應用商店的前 5000 名應用有76個被感染。360 應用商店檢查後發現,共有1076個 App 被感染,包括微信、網易雲音樂、滴滴打車、高德地圖、12306、同花順等熱門應用。蘋果公司將所有被感染的版本,都從官方軟件商店下架了。這個事件就稱為 XcodeGhost 事件

國家互聯網應急中心專門發出了預警通知。

追查下去,那些動過手腳的 Xcode 都不是從官方渠道下載的,而是來自網盤或下載站。一個網名"coderfun"的人,在各種 iOS 開發者論壇或者微博留言,引誘其他開發者下載修改過的 Xcode,版本從 Xcode 6.1 到 6.4。

事後,這位 coderfun 發出致歉公告,表示這只是自己的一次實驗,沒有惡意。但是,這個事件足以引起警惕,任何下載的文件都不一定安全,很可能被修改過或植入惡意代碼。

二、軟件的防偽措施

為了防止來源不明的軟件,很多平臺都有簽名機制。軟件發佈必須由認證過的開發商,使用平臺的密鑰簽名。如果用戶安裝未簽名的軟件,平臺會彈出警告,阻止安裝。下面就是 MacOS 的警告。

但是,不可能所有開發者都去認證,尤其是認證要收費。而且,用戶對這種警告不在乎,一般都會忽略或手動關閉。所以,這種做法的效果不明顯。

目前的常用做法是,軟件發佈時,同時給出哈希碼和簽名文件。前者保證沒有被第三方修改,後者保證確實出自原始作者。

舉例來說,Linux 的發行版 Manjaro 除了提供原始的 iso 文件,還提供另外三個文件:sha1 哈希文件、sha 256 哈希文件和 sig 簽名文件。 它們保證了軟件的真實性。

三、哈希碼驗證

哈希碼指的是,文件內容經過哈希函數的計算,會返回一個獨一無二的字符串。哪怕原始內容只改動一個字節,哈希碼也會完全不同。用戶下載軟件後,只要計算一下哈希碼,再跟作者給出的哈希碼比較一下,就會知道軟件有沒有被改動。

目前,常用的三種哈希函數是 MD5、SHA1 和 SHA256。其中,SHA256 最安全,SHA1 次之,MD5 墊底。一般來說,軟件至少會提供其中一種哈希碼。

下面是哈希碼的驗證方法。

(1)Linux 系統

Linux 系統直接用md5sumsha1sumsha256sum這三個命令,計算哈希碼。


$ md5sum foo.zip
$ sha1sum foo.zip
$ sha256sum foo.zip

上面命令返回文件foo.zip的三種哈希碼。用戶再跟作者給出的哈希碼比對。如果不一致,文件就是被改動了,或者沒有完整下載。

有時,就像前面 Manjaro 的例子,哈希碼不是寫在網頁上,而是作為一個單獨的文本文件下載。這時可以使用-c參數。


$ md5sum -c foo.zip.md5file
$ sha1sum -c foo.zip.sha1file
$ sha256sum -c foo.zip.sha256file

上面命令會返回哈希碼的比對結果,直接告訴用戶是否一致。

(2)Mac 系統

MacOS 的驗證命令需要自己安裝。


$ brew install md5sha1sum

執行上面命令以後,md5sumsha1sum 就可以使用了。至於 sha256sum 要用 shasum -a256 命令代替。

(3)Windows 系統

Windows 可以下載安裝免費軟件 Quick hash 或者 Raymond's MD5 & SHA Checksum Utility。其中,Quick hash 是跨平臺的,還支持 Linux 和 MacOS。

四、簽名驗證

哈希碼只能保證文件內容沒有修改,但是哈希碼本身也有可能仿冒,完全可能連帶原始文件一起造假。

文件簽名能解決這個問題。軟件發佈時,作者用自己的私鑰,對發佈的軟件生成一個簽名文件(Manjaro 例子的 sig 文件),用戶使用作者的公鑰驗證簽名文件。

第一步,下載公鑰。

軟件的官網一般都會給出作者公鑰的下載方法。比如,Manjaro 就可以從 GitHub 倉庫下載公鑰。


$ wget github.com/manjaro/packages-core/raw/master/manjaro-keyring/manjaro.gpg

公鑰也有可能放在專門的公鑰服務器,這時可以使用gpg命令在從公鑰服務器下載。


$ gpg --keyserver hkp://eu.pool.sks-keyservers.net --search-keys [公鑰 ID]

上面命令會列出搜索結果,讓你選擇是否下載某一個公鑰。--keyserver參數指定公鑰服務器,search-keys參數給出搜索參數,可以是作者的名稱,也可以是公鑰的指紋。

gpg命令在 Linux 下可以直接使用,MacOS 和 Windows 需要安裝 GnuPG

第二步,導入公鑰。

下載得到公鑰後,將其導入操作系統。


$ gpg --import [公鑰文件]

如果有完整的公鑰指紋,gpg 命令的 --recv-key參數可以直接從服務器導入公鑰。


$ gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-key "27DE B156 44C6 B3CF 3BD7 D291 300F 846B A25B AE09"

第三步,驗證簽名。

導入公鑰以後,就可以驗證簽名文件(後綴名為 sig的 文件)了。


# 用法一
$ gpg --verify [簽名文件]

# 用法二
$ gpg --verify [簽名文件] [原始文件]

上面命令的兩種用法,效果是一樣的。但是,用法一要求原始文件與簽名文件同名,且在一個目錄下。比如,簽名文件是foo.iso.sig,原始文件必須是同目錄下的foo.iso

簽名文件一般包括完整的公鑰指紋,所以也可以跳過上面的第一步和第二步,直接從公鑰服務器獲取公鑰,驗證簽名。


$ gpg --keyserver-options auto-key-retrieve --verify [簽名文件]

(完)