每个人都下载文件,大家有没有想过,文件可能是假的,尤其来自网盘或专门的下载站。

本文就来谈谈如何识别文件的真假。


一、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 系统直接用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[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

可疑文件_如何识别文件的真假相关推荐

  1. navicat运行db文件_使用 YAML 文件配置 Jenkins 流水线

    本文转载自:Jenkins 中文社区 这也是一种自定义流水线 DSL 的方法 几年前,我们的 CTO 写了一篇关于 使用 Jenkins 和 Docker 为 Ruby On Rails 应用提供持续 ...

  2. pydicom读取头文件_.dcm格式文件软件读取及python处理详解

    要处理一些.dcm格式的焊接缺陷图像,需要读取和显示.dcm格式的图像.通过搜集资料收集到一些医学影像,并通过pydicom模块查看.dcm格式文件. 若要查看dcm格式文件,可下echo viewe ...

  3. java怎么导入文件_怎么将文件导入java

    这篇文章主要介绍了Java的写入文件的几种方法,需要的朋友可以参考下: 一.FileWritter写入文件 FileWritter,字符流写入字符到文件.默认情况下,它会使用新的内容取代所有现有的内容 ...

  4. fileinputstream resources 读取文件_压缩20M文件从30秒到1秒,包教包会

    作者:不学无数的程序员链接:https://www.jianshu.com/p/25b328753017 压缩20M文件从30秒到1秒的优化过程 有一个需求需要将前端传过来的10张照片,然后后端进行处 ...

  5. 关于python文件_关于python文件操作

    python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...

  6. python输入文件名读取文件_[Python] python3 文件操作:从键盘输入、打开关闭文件、读取写入文件、重命名与删除文件等...

    1.从键盘输入 Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘.这两个函数分别是:input()和raw_input(). Python 3中,不建议使用raw_input ...

  7. .so是什么文件_安卓 so 文件解析详解

    so 文件是啥?so 文件是 elf 文件,elf 文件后缀名是.so,所以也被称之为so 文件, elf 文件是 linux 底下二进制文件,可以理解为 windows 下的PE文件,在 Andro ...

  8. java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇

    本文是Java IO总结系列篇的第4篇,前篇的访问地址如下: 如果您阅读完成,觉得此文对您有帮助,请给我点个赞,您的支持是我不竭的创作动力. 为了方便大家理解,我特意制作了本文对应的视频:总结删除文件 ...

  9. 在内存中建立文件_磁盘与文件,搞懂它

    说一说计算机中的非常重要的两个东西磁盘和文件.搞清楚这两个东西有利于我们理解高级语言中关于I/O流操作的设计.它就像一把大杀器一样,无往而不利. 想一想,磁盘作为一个电脑中的硬件设备,操作系统是如何管 ...

最新文章

  1. 解决浮层弹出如何加上datepicker,并且浮动在上面
  2. Java 和操作系统交互,你猜会发生什么?
  3. 飞蚊症手术失败与Photostress Recovery
  4. php中得到复选框的数据的代码,表单复选框向PHP传输数据的代码
  5. 感想总结——热烈庆祝CSDN博客排名进入前20000名
  6. oracle升级后报 06502,Oracle数据库升级后报ORA-00704和ORA-39700错误
  7. 使用自动补全功能- MATLAB
  8. java手动调用finalize_Java并手动执行finalize
  9. JavaScript PHP 通过URLEncode字串判断其编码是UTF-8还是GBK
  10. spark机器学习电影推荐
  11. Python学习:Python分析中国人口(一)爬取数据
  12. root 存档位置 linux,Linux 档案与目录管理(转)
  13. 笔记本电脑的应用、维护、采购全攻略
  14. C++ windows下判断鼠标点击及获取像素点
  15. 3D渲染技术分享:用实时反射Shader增强画面颜值
  16. IBM X3650 M4 服务器维修 面板BOARD闪黄灯 SYS BRD ERR主板报错
  17. UE5黑客帝国3d print假室内的一些使用记录
  18. 中图分类号,文献标识码查询
  19. larver php7.0,关于PHP7.0与PHP5.6下Laravel博客应用性能对比分析详解
  20. 再论互联网公司盖楼那些事-东邪阿里

热门文章

  1. CloudCompare基础架构介绍(PPT)
  2. 在Ubuntu 14.04 64bit上进行md5加密编程
  3. 在Blender中创建真实的汽车CGI视觉动画效果
  4. 哈佛结构和冯诺依曼结构区别。
  5. linux C 多线程编程
  6. 配置flutter For IOS
  7. C++ 重载运算符简单举例
  8. Java进阶之自动拆箱与自动装箱
  9. 最新Java中Date类型详解
  10. java 16 -12 静态导入