Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)
linux下的学习开始总是艰难的,但有的时候,却发现linux下远比windows的操作来的实在的多——这下载文件的完整性就是其中一件,让本人觉着很爽的一件事情。在编译安装各种软件的时候,总要到各个网站上收集下软件源码包。正由于此,软件的入口就非常复杂,校验下载的文件是否被修改过就显得非常有必要了。而校验方法当前一般是md5,sha1,pgp三种。在windows那个漫长的岁月里(沧桑有木有),一般只能接触到前两种——前提是你会去校验的话。
md5校验
原理:对文件进行md5 hash,求出文件的md5哈希值,通过下载后文件md5哈希值和发布者提供的md5哈希值是否一致来判断文件是否在发布者发布之后被篡改过。
说明:寿命老长的一个hash算法,适用范围广,网站存储密码也经常使用。不同的文件产生的md5哈希值是唯一的,但这点已经有办法通过对文件进行少量的修改,让文件的md5后的哈希值保持一致。
使用:在centos下,要对文件进行md5 hash是很简单的,一个 md5sum 命令即可:
# $是终端提示符,非输入.
# #号是注释
# 没有提示符的是输出
#直接输出md5 hash
$ md5sum your-downloaded-file-name
fd4a1b802373c57c10c926eb7ac823d8 your-downloaded-file-name</p> <p>#将md5 hash值保存到md5-hash.txt文件中.
$ md5sum your-downloaded-file-name > md5-hash.txt
# 显示输出的md5-hast.txt内容
$ cat md5-hash.txt
fd4a1b802373c57c10c926eb7ac823d8 your-downloaded-file-name</p> <p># 通过md5-hash.txt来校验你下载的文件是否正确
$ md5sum -c md5-hash.txt
your-downloaded-file-name: ok
你是文件的发布者话,你可以通过md5sum把文件的哈希值发送给验证者,这样下载你文件的人就可以通过md5哈希值来验证你的文件正确性。反过来,我们在网站上下载文件之后,同时可以获取发布者的md5哈希值和本地生成的hash值对比,如果一致,认为文件是正确的。
sha1校验
原理: 原理同md5一样,都是通过对文件进行hash求值,比对文件发布者发布的hash值,通过是否相等判断文件是否被篡改
说明: sha1 hash求值方法可以说是md5的一个升级版本(sha1 20位,md5 16位),在hash求值方面,md5退出的舞台将有sha1占据。sha家族有五个算法:sha-1、sha-224、sha-256、sha-384,和sha-512,后四种有时候称为sha2
使用: centos有sha1的命令: sha1sum
# 说明同上
# 直接输出sha1 hash
$ sha1sum your-downloaded-file-name
12dc96cbd822598c1230c87622f3591461a77227 your-downloaded-file-name</p> <p># 将sha1 hash值保存到文件中
$ sha1sum your-downloaded-file-name > sha1-hash.txt
# 显示文件内容
$ cat sha1-hash.txt
12dc96cbd822598c1230c87622f3591461a77227 your-downloaded-file-name</p> <p>#通过sha1-hash.txt来校验我们下载的文件your-downloaded-file-name
# 注意,文件必须要要通过txt文件中的路径知道哦
$ sha1sum -c sha1-hash.txt
your-downloaded-file-name: ok
这个sha1和md5基本一致,需要补充说明下的是,在使用 md5sum 也好,还是 sha1sum 也罢,校验文件的时候,务必要让系统能够根据文件中提供的路径找到文件,如果文件找不到,是没有办法进行校验的。
如果是做多个文件的hash校验,可以通过一个文件保存多个文件的hash值即可。
pgp校验
原理:使用非对称加密,程序生成唯一的密钥对(公钥和私钥:public key和private key/secret key)。操作方法如下:
1.发布者通过用生成的密钥对中的私钥对要发布的文件进行签名,得到签名文件(sign);
2.发布者将密钥对中的公钥发布到公钥服务器;
3.发布者将文件和用私钥生成的签名一起发布;
4.验证者下载发布者发布的文件和签名;
5.使用pgp的程序获取的发布者第二步发布的公钥;
6.使用公钥校验文件签名
说明:签名算法中,密钥的用处分别是:公钥用于加密信息和验证,私钥用于解密和签名。私钥掌握在信息发布方,公钥可以任意分发。信息发布方用密钥进行对信息进行签名,接收方在获取公钥后,可以用公钥对发布方发布的信息+签名进行验证。如果验证失败则认为信息被篡改。在网络中,我们经常碰到的https协议,使用了同样的机制。
使用:由于pgp是商业应用程序,在centos/linux中,具有同类功能的是gpg(也就是:gnupg),同样遵守openpgp数据加密标准( rfc 4880 ),没有安装可以用 yum install gnupg 安装,命令是: gpg
# 说明同上
# 由于过程相对复杂,并且在实际使用中,校验用的比较多,因此这里只介绍文件的校验过程。
# 在获得文件和签名时,我们先用gpg校验签名,此时文件必须存在
$ gpg --verify downloaded-file-sign.asc
这里有多种情况,如果你只有签名,但生成签名的文件不存在时(系统没找到,一般应该放在同目录下面),返回的是:
gpg: 不含签名的数据
gpg: can't hash datafile: no data
当你有文件的时候,但还没有与签名对应的公钥时,gpg返回的信息类似下面:
gpg: 于 2013年05月06日 星期一 18时27分27秒 cst 创建的签名,使用 rsa,钥匙号 47acdafb
gpg: 无法检查签名:no public key
注意:上面的信息在不同的文件和操作系统上生成的信息是不同的。但在没有公钥的时候,你可以发现gpg提供了一个该签名对应的钥匙号:47acdafb,这个是我们需要找的公钥。
上面已经说过,发布者已经将公钥发布到公钥服务器中,供验证者下载,因此我们需要到公钥服务器中下载公钥,要下载公钥,钥匙号就很重要了。
可用的公钥服务器可以通过wikipedia 上的key server条目来查看常用的一些key服务器列表。这里使用hkp://pgp.mit.edu:
# 获取服务器上的public key
$ gpg --keyserver hkp://pgp.mit.edu --recv-keys 47acdafb
gpg: 下载密钥‘47acdafb’,从 hkp 服务器 pgp.mit.edu
gpg: 密钥 47acdafb:公钥“stephan mueller <stephan.mueller@atsec.com>”已导入
gpg: 没有找到任何绝对信任的密钥
gpg: 合计被处理的数量:1
gpg: 已导入:1
--recv-keys要与--keyserver配合使用,导入密钥对的公钥之后,我们就能够使用这个公钥来验证我们的签名了。
再次运行我们之前的验证命令(gpg --verify sign-file),就可以看到验证的结果了。
#这时候我们再次验证我们的签名,就能得到验证结果了
$ gpg --verify downloaded-file-sign.asc
gpg: 于 2013年05月06日 星期一 18时27分27秒 cst 创建的签名,使用 rsa,钥匙号 47acdafb
gpg: 完好的签名,来自于“stephan mueller <stephan.mueller@atsec.com>”
gpg: 警告:这把密钥未经受信任的签名认证!
gpg: 没有证据表明这个签名属于它所声称的持有者。
主钥指纹: b0f4 2d33 73f8 f6f5 10d4 2178 520a 9993 a1c0 52f8
看到这个结果,至少确认一个结果:这个文件是没有被篡改过的。
一般我们到这步也就差不多了。
但注意消息里面有个警告,说明这个是未受信任的签名认证。因为这个公钥谁都可以发布上去的,如果你确实需要进一步认证,可以在签名认证之前,你能还要联系下真正的发布者,确认这个密钥的信息——指纹!这个是这个算法的一个弱点。
如果签名认证已经通过,你也就可以安心的在自己的系统内编译,安装它了。
关于pgp的更多信息,可以参考以下网站:
- wikipedia pgp
- ubuntu gpg/pgp
- gnupg ,howtos中minihowto中有个zh的文档,是中文的
- gentoo gnupg
上一篇: Linux中限制用户访问权限的3种方法
下一篇: dd使用方法详解