惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Vulnerabilities – Threatpost
有赞技术团队
有赞技术团队
小众软件
小众软件
O
OpenAI News
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News and Events Feed by Topic
MongoDB | Blog
MongoDB | Blog
阮一峰的网络日志
阮一峰的网络日志
Hacker News: Ask HN
Hacker News: Ask HN
D
Docker
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
C
CERT Recently Published Vulnerability Notes
L
LINUX DO - 最新话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
Google Developers Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
GRAHAM CLULEY
S
Schneier on Security
T
Tor Project blog
Spread Privacy
Spread Privacy
PCI Perspectives
PCI Perspectives
Microsoft Security Blog
Microsoft Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Fortinet All Blogs
L
Lohrmann on Cybersecurity
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
The Exploit Database - CXSecurity.com
TaoSecurity Blog
TaoSecurity Blog
Apple Machine Learning Research
Apple Machine Learning Research
T
Threat Research - Cisco Blogs
T
Troy Hunt's Blog
罗磊的独立博客

阮一峰的网络日志

科技爱好者周刊(第 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 安全吗? 科技爱好者周刊(第 360 期):Dan Wang 的新书 科技爱好者周刊(第 359 期):Palantir 值得关注 科技爱好者周刊(第 358 期):如何拯救一家濒临倒闭的创业公司 扣子空间网页设计,是在挑战 V0 吗? 《唐纵日记》摘录 科技爱好者周刊(第 357 期):稳定币的博弈 科技爱好者周刊(第 356 期):公司强推 AI 编程,我该怎么办 科技爱好者周刊(第 355 期):两本《芯片战争》 科技爱好者周刊(第 354 期):8000mAh 手机电池,说明了什么? 科技爱好者周刊(第 353 期):苹果的"液态玻璃"是为了 AR 科技爱好者周刊(第 352 期):Bug 追踪系统的正确样子 科技爱好者周刊(第 351 期):GitHub Issues(几乎)是最好的笔记应用 科技爱好者周刊(第 350 期):Java 三十周年 科技爱好者周刊(第 349 期):神经网络算法的发明者 科技爱好者周刊(第 348 期):李飞飞,从移民到 AI 明星 科技爱好者周刊(第 347 期):冷启动的破解之道 科技爱好者周刊(第 346 期):未来就是永恒感的丧失 科技爱好者周刊(第 345 期):HDMI 2.2 影音可能到头了 科技爱好者周刊(第 344 期):制造业正在"零工化" 科技爱好者周刊(第 343 期):如何阻止 AI 爬虫 科技爱好者周刊(第 342 期):面试的 AI 作弊----用数字人去面试 科技爱好者周刊(第 341 期):低代码编程,恐怕不会成功 科技爱好者周刊(第 340 期):技术炒作三十年 科技爱好者周刊(第 339 期):代币是什么 科技爱好者周刊(第 338 期):重新思考 6G 科技爱好者周刊(第 337 期):互联网创业几乎没了 科技爱好者周刊(第 336 期):面对 AI,互联网正在衰落 科技爱好者周刊(第 335 期):年底的未来已来 科技爱好者周刊(第 334 期):年终笔记四则 科技爱好者周刊(第 333 期):一切都要支付两次 科技爱好者周刊(第 332 期):西蒙·威利森的年终总结,梁文锋的访谈 科技爱好者周刊(第 331 期):你可能是一个 NPC 科技爱好者周刊(第 330 期):李开复梳理人工智能 科技爱好者周刊(第 329 期):示意图利器 D2 科技爱好者周刊(第 328 期):AI 模型不是一门好生意 科技爱好者周刊(第 327 期):没有链接的互联网 科技爱好者周刊(第 326 期):世界没有那么多财富 科技爱好者周刊(第 325 期):VS Code 编辑器的下一站是 Zed? 科技爱好者周刊(第 324 期):人类已知的最大质数 科技爱好者周刊(第 323 期):技术公司的口号比拼 科技爱好者周刊(第 322 期):内容行业的内幕 科技爱好者周刊(第 321 期):傅盛回忆录 科技爱好者周刊(第 320 期):乒乓仓 科技爱好者周刊(第 319 期):如何拍出爆款视频 科技爱好者周刊(第 318 期):创业咖啡馆的记忆 科技爱好者周刊(第 317 期):驴子、老虎和狮子的寓言 科技爱好者周刊(第 316 期):你一生的故事 科技爱好者周刊(第 315 期):一份谷歌离职报告 科技爱好者周刊(第 314 期):《黑神话:悟空》可以产业化吗? 科技爱好者周刊(第 313 期):如果新加坡没有空调
如何识别文件的真假
阮一峰 · 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 [签名文件]

(完)