概述
互联网已经广泛普及。带宽越来越高,网络上可供下载的软件越来越多。这些软件方便我们的生活与工作,解决我们的问题的同时,也包含着误码和带毒的风险。相同软件,往往存在多个可用下载地址。网络传输有时会出错,导致下载到的软件不可用。用含有错误的软件光盘映像刻盘的结果是白白浪费时间和光盘。黑客也利用网络,将木马、病毒等隐藏在看起来有用的网络软件中。当然,从官网下载一般比较不会含有恶意代码,但是一些远隔重洋的官网常常会很慢,而且由于传输距离可能很远导致误码较多。使用散列值(也称为哈希,Hash)校验,可以确认就近下载到的文件与官方来源一致,防止下载到无用或者被恶意篡改的文件。如果软件含有数字签名,则能够确认其是否未经篡改的来自特定的发行者。
散列值
散列函数(或散列算法,Hash Function)是从任何长度数据创建小的数字“指纹”的方法。散列将数据打乱混合计算,得到一个称为散列值的结果。散列值看起来通常是一个短的随机字母和数字组成的字符串。用作校验目的的散列函数是一个“单向”操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。被广泛使用的这类散列函数包括MD5,SHA-1,SHA-256等。许多软件在官网下载页面上提供了散列值。软件下载完成后,使用散列工具计算下载到的文件的散列值,与官网上的散列值(如图1所示)比对后即可确认所下载的软件与官网发布的是否完全一致。
软件来源的鉴别_校验
图 1 网站上给出的软件对应散列值(Hash)
数字签名
数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。
数字签名(Digital Signature)技术是不对称加密算法的典型应用。数字签名的应用过程是,数据源发送方使用自己的私钥对数据的散列值进行加密处理,完成对数据的合法“签名”,数据接收方则利用对方的公钥来验证收到的“数字签名”。由于只有使用与公钥对应的私钥产生数字签名值能通过验证运算,所以数字签名是不可篡改,不可抵赖的。
公钥和签名者的身份标识一起构成了证书,可信任的证书被可信任的证书颁发机构所签署。如果软件被篡改,或者证书被篡改,都会导致签名的验证呈现无效的状态(如图6所示)。
计算散列的工具和方法
虽然Windows系统内部广泛使用MD5、SHA-1等常用散列算法,但是系统并没有提供一个计算MD5的程序或者命令。网络上有大量的计算散列的软件可供下载,可以在搜索引擎上搜索并参考口碑选择一个。使用Cygwin的相关dll,可以在Windows中运行Linux环境下的md5sum,sha1sum这两个命令,本文附带有其下载。将压缩包中所有文件解压到C:\Windows\System32下,即可在开始->运行->cmd.exe所打开的命令行窗口中使用这两个命令计算文件的散列值,如图2所示。
软件来源的鉴别_数字签名_02
图 2 使用md5sum.exe和sha1sum.exe命令计算散列值
Linux内置有md5sum, sha1sum这两个命令。在终端中运行md5sum <filename>,或者sha1sum <filename> 即可得到相应的散列值。
检验数字签名的方法
含有数字签名的软件在系统中可以通过右键打开文件属性对话框。在数字签名页,点击详细信息,即可查看其数字签名的有效性。下面图3-图5是检查有效的Adobe Reader 安装包的数字签名示例。图6是使用工具篡改内容之后的呈现无效结果的示例。
软件来源的鉴别_哈希_03
图 3 查看文件属性
软件来源的鉴别_校验_04
图 4 文件属性-数字签名
软件来源的鉴别_软件_05
图 5 有效的数字签名示例
使用二进制文件编辑工具,故意修改文件中的一个比特后,检验结果如下:
软件来源的鉴别_散列_06
图 6 无效的数字签名示例
小结
通过散列或数字签名对网络下载的软件进行校验,充分利用丰富的互联网资源的同时,拒绝散列值不一致的文件,拒绝数字签名无效的文件,将有效的提高效率和维护系统的安全。