本文就来谈谈如何识别文件的真假。
一、XcodeGhost 事宜
我们从一件真实的事宜提及。
2015 年 9 月,苹果手机的一些 App 被创造[1]向可疑网站发送数据。进一步调查确认,可疑代码是 Xcode 打包时植入的。也便是说,开拓者的编程工具 Xcode 被动过手脚了。

腾讯的安全团队公布调查报告[2],运用商店的前 5000 名运用有 76 个被传染。360 运用商店检讨后创造[3],共有 1076 个 App 被传染,包括微信、网易云音乐、滴滴打车、高德舆图、12306、同花顺等热门运用。苹果公司将所有被传染的版本,都从官方软件商店下架了。这个事宜就称为 XcodeGhost 事宜[4]。
国家互联网应急中央专门发出了预警关照。
追查下去,那些动过手脚的 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 系统直接用md5sum
、sha1sum
、sha256sum
这三个命令,打算哈希码。
$ 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
实行上面命令往后,md5sum
和sha1sum
就可以利用了。至于sha256sum
要用shasum -a256
命令代替。
(3)Windows 系统
Windows 可以下载安装免费软件 Quick hash[5]或者 Raymond’s MD5 & SHA Checksum Utility[6]。个中,Quich 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[7]。
第二步,导入公钥。
下载得到公钥后,将其导入操作系统。
$ 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 [署名文件]
(完)
参考资料 [1] 创造: https://web.archive.org/web/20150920191633/http://drops.wooyun.org/news/8864 [2] 调查报告: https://security.tencent.com/index.php/blog/msg/96 [3] 创造: https://www.anquanke.com/post/id/82436 [4] XcodeGhost 事宜: https://zh.wikipedia.org/wiki/XcodeGhost%E9%A3%8E%E6%B3%A2 [5] Quick hash: https://www.quickhash-gui.org/ [6] Raymond’s MD5 & SHA Checksum Utility: https://download.cnet.com/MD5-SHA-Checksum-Utility/3000-2092_4-10911445.html [7] GnuPG: https://gnupg.org/download/index.html