0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么样才能识别文件的真假

Wildesbeast ? 来源:今日头条 ? 作者:阮一峰的网络日志 ? 2020-02-18 12:30 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

一、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 [签名文件]

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11524

    浏览量

    214447
  • APP
    APP
    +关注

    关注

    33

    文章

    1587

    浏览量

    74456
  • iOS
    iOS
    +关注

    关注

    8

    文章

    3399

    浏览量

    153455
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    电脑无法识别K230,MTP USB设备无法启动怎么解决?

    我没有端口号是重复的 求大佬帮忙看看,网上找不到和我一的情况,实在不行能不能有什么虚拟U盘的替代方案,我现在想看设备文件得拔下TF卡插到电脑上在去用Linuxreader才能预览文件
    发表于 07-29 09:38

    win7无法识别USB设备怎么解决?

    我现在有一个添加了CDC的FX3固件,该设备可以在win10和win11上正常工作,但在win7似乎并不能正确的识别设备,串口和USB设备都不能正常识别。我应该怎么操作才能解决这个问题?
    发表于 07-16 06:52

    基于LockAI视觉识别模块:手写数字识别

    Result对象包含预测得分(score)和对应的标签ID(label_id),即识别出的手写数字。 2.2 Visualize函数 2.2.1 头文件 #include <
    发表于 06-30 16:45

    如何才能知道英飞凌Bluetooth?产品支持哪种Bluetooth?配置文件和版本?

    如何才能知道英飞凌Bluetooth?产品支持哪种Bluetooth?配置文件和版本? A2DP、AVRCP、HSP、HFP 等 是否有一个网页或文档解释每个设备支持哪些配置文件和版本? 目前我想了解以下设备特别支持的配
    发表于 06-27 06:04

    STM32N6570-DK 的STLINK口不能识别出STLINK,为什么?

    使用数据线连接STM32N6570-DK的CN6口和电脑,存在不能识别出STLINK的情况。这个板子集成的STLINK是连上数据线就能识别出STLINK,还是配置硬件才能识别出来?我电
    发表于 06-16 07:14

    CLRC663如何增强对RFID标签ic的识别距离?

    我现在在使用clrc663通过ISO15693协议识别rifd标签 ic无线圈(尺寸5*5mm),我现在的方案识别距离很短接近0时才能识别,我这边需要将
    发表于 03-17 07:50

    怎样才能使用NUCLEO-H563ZI 识别出ST-LINK ?

    控制的?这个管脚默认的值是高还是低? 怎样才能使用NUCLEO-H563ZI ,识别出ST-LINK ?其开发环境需要什么版本的
    发表于 03-14 13:59

    NFS网络文件系统深度解析

    NFS:Network File System 网络文件系统,基于内核的文件系统。Sun 公司开发,通过使用 NFS,用户和程序可以像访问本地文件访问远端系统上的
    的头像 发表于 03-01 14:15 ?778次阅读

    怎么才能通过ADC10MENO算出原始的X,Y,Z方向加速度的值?

    我刚刚接触MSP430,前段时间有幸拥有一TI的一块MSP430fr5739开发板,就在我用里面的加速度传感器计算角度时,发现不知道该怎么才能通过ADC10MENO算出原始的X,Y,Z方向加速度的值,望各高手帮忙
    发表于 02-13 07:58

    用TLV2541进行AD采样,怎么才能使采样为准确的1K?

    我现在想用TLV2541进行AD采样,我们要求采样频率为1K,我现在不知道怎么才能使采样为准确的1K。用单片机的SPI接口怎样才能实现?谢谢
    发表于 02-10 07:58

    如何辨别网线真假

    辨别网线的真假可以从以下几个方面入手: 一、查看包装和标识 检查包装:正品网线的包装通常比较精美,纸质较好,上面的印刷信息清晰,包括产品产地、执行标准、种类、长度等。有些品牌还会在外包装上贴上防伪
    的头像 发表于 01-10 10:28 ?1516次阅读

    下载PGA900 GUI Installer这个软件安装文件,电脑无法识别文件,该如何解决?

    请问下,从TI官网上下载的PGA900 GUI Installer这个软件安装文件,电脑无法识别文件,该如何解决?
    发表于 12-20 08:06

    请问TAS5754 PPC2怎么才能生成.h文件

    我手上没有TI的相关评估板,但想为我的TAS5754 生成配置文件,通过MCU的I2C配置它,但是我的PPC2 上面按钮是灰色的,请问该怎么弄。我看官方的文档的步骤里都是先连接评估板,是否必须连接评估板才能生成H文件
    发表于 10-15 06:34

    LM4871怎么才能输出最大的功率呢?

    你好,请问一下负载是一个电感线圈,阻值1.2R,电感值为96uh。怎么才能输出最大的功率呢,供电是3.7V的锂电池。
    发表于 09-30 07:01

    使用TINA时,想输入一个外部激励信号,怎么才能使波形连续循环输出呢?

    在使用TINA时,想输入一个外部激励信号,用语句描述如下,怎么才能使波形连续循环输出呢 REPEAT FOREVER 0 -24 3.33e-6 -24 3.33e-6 24 6.66e-6
    发表于 08-09 07:05