Linux下校验下载文件的完整性(MD5,SHA1,PGP)
查看:
Linux下校验下载文件的完整性(MD5,SHA1,PGP)
http://blog.useasp.net/archive/2014/03/29/use-md5-sha1-or-pgp-to-check-downloaded-file-integrity-on-linux.aspx
Linux下的学习开始总是艰难的,但有的时候,却发现Linux下远比Windows的操作来的实在的多——这下载文件的完整性就是其中一件,让本人觉着很爽的一件事情。在编译安装各种软件的时候,总要到各个网站上收集下软件源码包。正由于此,软件的入口就非常复杂,校验下载的文件是否被修改过就显得非常有必要了。而校验方法当前一般是MD5,SHA1,PGP三种。在Windows那个漫长的岁月里(沧桑有木有),一般只能接触到前两种——前提是你会去校验的话。
原理:对文件进行MD5 Hash,求出文件的MD5哈希值,通过下载后文件MD5哈希值和发布者提供的MD5哈希值是否一致来判断文件是否在发布者发布之后被篡改过。
说明:寿命老长的一个Hash算法,适用范围广,网站存储密码也经常使用。不同的文件产生的MD5哈希值是唯一的,但这点已经有办法通过对文件进行少量的修改,让文件的MD5后的哈希值保持一致。
使用:在CentOS下,要对文件进行MD5 Hash是很简单的,一个md5sum
命令即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# $是终端提示符,非输入. # #号是注释 # 没有提示符的是输出 #直接输出MD5 Hash $ md5sum your-downloaded- file -name fd4a1b802373c57c10c926eb7ac823d8 your-downloaded- file -name #将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 # 通过md5-hash.txt来校验你下载的文件是否正确 $ md5sum -c md5- hash .txt your-downloaded- file -name: OK |
你是文件的发布者话,你可以通过md5sum把文件的哈希值发送给验证者,这样下载你文件的人就可以通过MD5哈希值来验证你的文件正确性。反过来,我们在网站上下载文件之后,同时可以获取发布者的MD5哈希值和本地生成的Hash值对比,如果一致,认为文件是正确的。
原理: 原理同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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 说明同上 # 直接输出SHA1 Hash $ sha1sum your-downloaded- file -name 12dc96cbd822598c1230c87622f3591461a77227 your-downloaded- file -name # 将SHA1 Hash值保存到文件中 $ sha1sum your-downloaded- file -name > sha1- hash .txt # 显示文件内容 $ cat sha1- hash .txt 12dc96cbd822598c1230c87622f3591461a77227 your-downloaded- file -name #通过sha1-hash.txt来校验我们下载的文件your-downloaded-file-name # 注意,文件必须要要通过txt文件中的路径知道哦 $ sha1sum -c sha1- hash .txt your-downloaded- file -name: OK |
这个SHA1和MD5基本一致,需要补充说明下的是,在使用md5sum
也好,还是sha1sum
也罢,校验文件的时候,务必要让系统能够根据文件中提供的路径找到文件,如果文件找不到,是没有办法进行校验的。
如果是做多个文件的Hash校验,可以通过一个文件保存多个文件的Hash值即可。
原理:使用非对称加密,程序生成唯一的密钥对(公钥和私钥:Public Key和Private Key/Secret Key)。操作方法如下:
- 发布者通过用生成的密钥对中的私钥对要发布的文件进行签名,得到签名文件(sign);
- 发布者将密钥对中的公钥发布到公钥服务器;
- 发布者将文件和用私钥生成的签名一起发布;
- 验证者下载发布者发布的文件和签名;
- 使用PGP的程序获取的发布者第二步发布的公钥;
- 使用公钥校验文件签名
说明:签名算法中,密钥的用处分别是:公钥用于加密信息和验证,私钥用于解密和签名。私钥掌握在信息发布方,公钥可以任意分发。信息发布方用密钥进 行对信息进行签名,接收方在获取公钥后,可以用公钥对发布方发布的信息+签名进行验证。如果验证失败则认为信息被篡改。在网络中,我们经常碰到的 HTTPS协议,使用了同样的机制。
使用:由于PGP是商业应用程序,在CentOS/Linux中,具有同类功能的是GPG(也就是:GnuPG),同样遵守OpenPGP数据加密标准(RFC 4880),没有安装可以用yum install gnupg
安装,命令是:gpg
1
2
3
4
|
# 说明同上 # 由于过程相对复杂,并且在实际使用中,校验用的比较多,因此这里只介绍文件的校验过程。 # 在获得文件和签名时,我们先用gpg校验签名,此时文件必须存在 $ gpg --verify downloaded- file -sign.asc |
这里有多种情况,如果你只有签名,但生成签名的文件不存在时(系统没找到,一般应该放在同目录下面),返回的是:
1
2
|
gpg: 不含签名的数据 gpg: can't hash datafile: No data |
当你有文件的时候,但还没有与签名对应的公钥时,gpg返回的信息类似下面:
1
2
|
gpg: 于 2013年05月06日 星期一 18时27分27秒 CST 创建的签名,使用 RSA,钥匙号 47ACDAFB gpg: 无法检查签名:No public key |
注意:上面的信息在不同的文件和操作系统上生成的信息是不同的。但在没有公钥的时候,你可以发现gpg提供了一个该签名对应的钥匙号:47ACDAFB,这个是我们需要找的公钥。
上面已经说过,发布者已经将公钥发布到公钥服务器中,供验证者下载,因此我们需要到公钥服务器中下载公钥,要下载公钥,钥匙号就很重要了。
可用的公钥服务器可以通过wikipedia 上的Key Server条目来查看常用的一些key服务器列表。这里使用hkp://pgp.mit.edu:
1
2
3
4
5
6
7
|
# 获取服务器上的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),就可以看到验证的结果了。
1
2
3
4
5
6
7
|
#这时候我们再次验证我们的签名,就能得到验证结果了 $ 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 |
看到这个结果,至少确认一个结果:这个文件是没有被篡改过的。
一般我们到这步也就差不多了。
但注意消息里面有个警告,说明这个是未受信任的签名认证。因为这个公钥谁都可以发布上去的,如果你确实需要进一步认证,可以在签名认证之前,你能还要联系下真正的发布者,确认这个密钥的信息——指纹(fingerprint)!这个算是PGP算法的一个弱点。
如果签名认证已经通过,你也就可以安心的在自己的系统内编译,安装它了。
关于PGP的更多信息,可以参考以下网站:
- wikipedia PGP
- ubuntu GPG/PGP
- GnuPG,HOWTOs中MiniHOWTO中有个zh的文档,是中文的
- gentoo GnuPG
Linux下校验下载文件的完整性(MD5,SHA1,PGP)的更多相关文章
- Linux下sz下载文件超过4G办法
当下载文件超过4G时,sz提示能下载. 解决办法有以下几种: 1.scp 2.ftp 3.nc 4.icmp 5.文件切割 ---------------------------------- 以上4 ...
- Linux 下的下载文件命令
普通文件只需 wget fileAddr 下载带有登录验证的文件 [chen@localhost Downloads]$ wget --user='av\bname' --ask-password ...
- Windows计算下载文件的SHA256 MD5 SHA1
引用自 http://blog.163.com/licanli2082@126/blog/static/35748686201284611330/ certutil -hashfile yourfil ...
- Linux下几种文件传输命令
Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...
- 用脚本如何实现将Linux下的txt文件批量转化为Windows下的txt文件?
众所周知,Windows和Linux的文件换行回车格式不同,Windows下换行格式是\r\n(回车+换行),Linux下换行格式为\n(只是换行),因此,其中一个操作系统的文本文件若需要在另外一个中 ...
- Linux下几种文件传输命令 sz rz sftp scp
Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...
- [原创] Linux下几种文件传输命令 sz rz sftp scp介绍
Linux下几种文件传输命令 sz rz sftp scp介绍 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等 ...
- Linux下重要日志文件及查看方式
http://os.51cto.com/art/201108/282184_all.htm 1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的 ...
- 用Go校验下载文件之SHA256
用GO校验下载文件之SHA256 原来对计算机和网络使用安全这块不够重视,用了N多年盗版的操作系统和办公软件,为了破解使用过各种激活软件,也安装使用过很多别人破解过的软件:网络下载的文件从不校验.慢慢 ...
随机推荐
- [POJ] #1006# Biorhythms : 最小公倍数/同余问题
一. 题目 Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127263 Accepted: 403 ...
- HDFS的Shell
调用文件系统(FS)Shell命令应使用 $HADOOP_HOME/bin/hadoop fs 的形式. 所有的FS Shell命令使用URI路径作为参数. URI格式是scheme://author ...
- jquery 回车切换 tab功能
挺有趣的,Jquery 回车切换tab功能的实现哦 <html> <head><!--jquery库.js--></head> <body> ...
- Windows Socket 最大连接数
Socket 编程时,单机最多可以建立多少个 TCP 连接,受到操作系统的影响. Windows 下单机的TCP连接数受多个参数影响: 最大TCP连接数 [HKEY_LOCAL_MACHINE \Sy ...
- css3 动画demo
1)http://www.yyyweb.com/demo/css-cokecan/inner.html 2)页面切换效果demo http://www.yyyweb.com/demo/page-tra ...
- JS、jqueryie6浏览器下使用js无法提交表单的解决办法
-----------------------JS.jqueryie6浏览器下使用js无法提交表单的解决办法---------------------------------------------- ...
- 命令行解析getopt_long
getopt_long函数可以轻松的解析main函数的命令行参数. int getopt_long(int argc,char * const argv[],const char *optstring ...
- OC:习题来自平时搜索
== 第一部分 == 类变量的@protected ,@private,@public,@package,声明各有什么含义?写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?面向对象的三大特征 ...
- 使用XCopy发布网页
链接:https://documentation.devexpress.com/#eXpressAppFramework/CustomDocument113245 In this lesson, yo ...
- 基于Emgu cv的图像拼接(转)
分类: 编程 C# Emgu cv Stitching 2012-10-27 11:04 753人阅读 评论(1) 收藏 举报 在新版本的Emgu cv中添加了Emgu.CV.Stitching,这极 ...