March 2014 Blog Posts

Linux下校验下载文件的完整性(MD5,SHA1,PGP)

MitchellChu 2014-03-29 Unix & Linux

Linux下的学习开始总是艰难的,但有的时候,却发现下远比Windows的操作来的实在的多——这下载文件的完整性就是其中一件,让本人觉着很爽的一件事情。在编译安装各种软件的时候,总要到各个网站上收集下软件源码包。正由于此,软件的入口就非常复杂,是否被修改过就显得非常有必要了。而校验方法当前一般是MD5,SHA1,PGP三种。在Windows那个漫长的岁月里(沧桑有木有),一般只能接触到前两种——前提是你会去校验的话。

原理:对文件进行MD5 Hash,求出文件的MD5哈希值,通过下载后文件MD5哈希值和发布者提供的MD5哈希值是否一致来判断文件是否在发布者发布之后被篡改过。

说明:寿命老长的一个Hash算法,适用范围广,网站存储密码也经常使用。不同的文件产生的MD5哈希值是唯一的,但这点已经有办法通过对文件进行少量的修改,让文件的MD5后的哈希值保持一致。

使用:在CentOS下,要对文件进行MD5 Hash是很简单的,一个md5sum命令即可:

# $是终端提示符,非输入.
# #号是注释
# 没有提示符的是输出
#直接输出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

# 说明同上
# 直接输出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)。操作方法如下:

  1. 发布者通过用生成的密钥对中的私钥对要发布的文件进行签名,得到签名文件(sign);
  2. 发布者将密钥对中的公钥发布到公钥服务器;
  3. 发布者将文件和用私钥生成的签名一起发布;
  4. 验证者下载发布者发布的文件和签名;
  5. 使用PGP的程序获取的发布者第二步发布的公钥;
  6. 使用公钥校验文件签名

说明:签名算法中,密钥的用处分别是:公钥用于加密信息和验证,私钥用于解密和签名。私钥掌握在信息发布方,公钥可以任意分发。信息发布方用密钥进行对信息进行签名,接收方在获取公钥后,可以用公钥对发布方发布的信息+签名进行验证。如果验证失败则认为信息被篡改。在网络中,我们经常碰到的HTTPS协议,使用了同样的机制。

使用:由于PGP是商业应用程序,在CentOS/Linux中,具有同类功能的是GPG(也就是:),同样遵守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

 看到这个结果,至少确认一个结果:这个文件是没有被篡改过的。

一般我们到这步也就差不多了。

但注意消息里面有个警告,说明这个是未受信任的签名认证。因为这个公钥谁都可以发布上去的,如果你确实需要进一步认证,可以在签名认证之前,你能还要联系下真正的发布者,确认这个密钥的信息——指纹(fingerprint)!这个算是PGP算法的一个弱点。

如果签名认证已经通过,你也就可以安心的在自己的系统内编译,安装它了。

关于PGP的更多信息,可以参考以下网站:

  1. wikipedia PGP
  2. ubuntu GPG/PGP
  3. GnuPG,HOWTOs中MiniHOWTO中有个zh的文档,是中文的
  4. gentoo GnuPG

wget下载进度条变成多行显示的解决方法

MitchellChu 2014-03-19 Unix & Linux

在之前为了解决Putty客户端连接到CentOS之后显示乱码的问题,设置了LANG=zh_CN.UTF-8之后,在使用的时候,wget下载,竟然不能在一行显示了,变成了坑爹的多行显示,每一个周期wget自动会产生新的一行,结果下载进度慢点的文件,不用一会儿整个屏幕就全是wget进度条的天下了。

wget 的进度条变成了悲催的屏幕杀手,满屏幕都是下面这样的...(=号省略无数个)

99% [==========================================> ] 10,416,337  6.09K/s eta(英国中部时
99% [==========================================> ] 10,419,241  6.10K/s eta(英国中部时
99% [==========================================> ] 10,419,241  5.73K/s eta(英国中部时
99% [==========================================> ] 10,425,049  5.79K/s eta(英国中部时
99% [==========================================> ] 10,427,953  5.65K/s eta(英国中部时
100%[===========================================>] 10,431,288  5.65K/s   in 27m 12s

这和原来的一行显示进度条的节奏完全不同啊。后面才发现这是因为翻译的时候,eta被转成eta(英国中部时间),导致整个输出太长,引起了断行,导致下次输出必须从新行开始。

再后来,发现网上也有很多人出现这个问题,关键是,这个问题从很早之前就一直存在,修改起来倒还是挺快的。

#注意文件路径是在:/usr/share/locale/zh_CN/LC_MESSAGES/

cd /usr/share/locale/zh_CN/LC_MESSAGES/
#先重命名
mv wget.mo wget.mo.bak
#从重命名后的文件里替换eta(英国中部时间)为ETA,并导出新文件
msgunfmt wget.mo.bak -o - | sed 's/eta(英国中部时间)/ETA/' | msgfmt - -o wget.mo

TIPs:

1. 如果没有msgunfmt 和msgfmt,请安装

2. 以上命令本人是在root用户下操作

putty SSH连到CentOS显示乱码的解决方法

MitchellChu 2014-03-18 Unix & Linux

使用(版本0.62)通过SSH连接到CentOS(版本6.4)时,在客户端显示中文时会显示乱码。为了让putty显示正常,需要做如下操作:

1. 在上设置 /etc/sysconfig/i18n为如下内容

LANG="zh_CN.UTF-8"

2. 在putty的PuTTY Configuration窗口中设置如下:

1. Window->Appearance->font setting
设置字体为:新宋体,10号

2. Window->Translation->Remote character set
设置值为:UTF-8

 这样设置后的putty通过SSH连接到CentOS上,中文字符正常显示,不再出现

Update:

这个设置可能会引起其他软件的一些问题,比如:wget下载进度条会变成多行显示.

CentOS网络配置后不能访问外网

MitchellChu 2014-03-18 Unix & Linux

今天在按照Mitchell博客之前的CentOS网络配置的文章配置Linux网卡之后,发现竟然ping不通外网,但是内网ping却是正常的。一直很纳闷,在网上搜索很久也没有得到答案。关于网络的具体配置项,可以参考Mitchell博客之前的那篇文章。

现象:

ping内网正常

ping外网IP,域名均无法正常,返回错误:connect: Network is unreachable

 

后面在无意中看到有添加网关的命令:

route add default gw 192.168.128.2 dev eth0

按上面操作,添加了默认的网关之后。再次访问外网一切正常。

有这个现象来看,应该是配置文件中没有配置网关,但是经过确认/etc/sysconfig/network 中是配置了GATEWAY地址的,而且GATEWAY的地址也是正确的,在多次重启network之后,只要不手动添加网关,就不能访问外网。

多次仔细确认各个之后,发现在网卡配置文件中(ifcfg-eth0)有一个NETWORK配置项,对于这个配置项,本身作用不是很清楚,因此到官网查看了一下说明:

NETWORK=<address>
where <address> is the network address. This directive is deprecated, as the value is calculated automatically with ifcalc.

这节奏是告诉我们这个参数不要设置嘛(deprecate),这个值将会由ifcalc自动计算。既然不用设置,自然去掉。

去掉之后,重启network服务之后,外网竟然神奇的能够访问了。使用route查看路由表,发现能够自动添加default这条信息了,原来可是一直没有的:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.128.0   *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
default         192.168.128.2   0.0.0.0         UG    0      0        0 eth0

看来问题正是这个引起的。至于具体为什么会这样,这个设置会产生什么样的影响还不是很清楚。

TIPs:为了简单,你也可以将IPADDR,GATEWAY等设置到ifcfg-eth*的文件中,不用将GATEWAY单独设置在network中。

产品出现问题,碰到商家推诿如何处理?

MitchellChu 2014-03-17 万象漫谈

自己买了个东西,用了不久就出现问题,找商家,商家有些不愿意提供进一步服务,就暂缓和商家进行进一步沟通,在网站上收录了些的相关信息,罗列如下:

 

对于个人消费者:

根据《消费者权益保护法》中的
1.产品自售出之日起7日内,发生性能故障,消费者可以选择退货、换货或修理。(第9条)
2.产品自售出之日起l5日内,发生性能故障,消费者可以选择换货或修理。(第10条)
3.在三包有效期内(一般是1年),修理两次,若仍不能正常使用,凭修理者提供的修理记录和证明,有权向销售者提出换货或退货要求。(第11条)

 

对于企业用户:

》是不适用的,这个一般以开发票的为准,虽然不能使用《消费者权益保护法》但是如果是个人消费的话,此时可以根据《中华人民共和国产品质量法》来进行维权:
1.产品仅有质量问题,消费者可向销售者追究责任。(40条)
2.产品质量问题造成人身或缺陷产品意外的损害,消费者可向销售者或生产者追究责任。(41条和43条)

 

对于在线商城:

商城规定只能“购买XX日以内退换”是合法的,但此规定是不能剥夺消费者要求修理的权利。修是能修,而且修了2次都修不好就能退换了。
此外,产品说明书上的“3个月内包换”的保证可视为生产者对消费者的承诺,这承诺不违反三包规定,是有效的。只不过其产生的效力只及于消费者和生产者之间,不能约束销售者。
结合上面的说法,你可以拿着说明书去找生产者换。但在线商城是可以耍赖的。

 

如果确实在维权过程中,发现要保护消费者自己的权益相当困难,可以酌情使用以下方法:

1. 找记者,小报、早晚报均可。联系他们之后,向他们爆料,很多记者都在等着盼着这种料。
2. 找消费者协会,如果离315太远,可以攒着到时候再爆料。
3. 找工商,要求维护自己合法权益,只要是正当权益,就应该理直气壮的要求工商维护你的权益(更何况,他们还是靠我们税收过活的)。
4. 找商家/客服,告诉她你已经做了以上三件事,如果不解决,就会做第五件。
5. 起诉,用法律的武器捍卫自己的合法权益。最好去贴吧里找些类似受害者一起起诉,如果能遇上网络红人就更妙了。

当然,在任何过程中,请注意保存一切可以使用的资料(包括但不限于:录音,视频,发票,沟通的完整备份等),以便在必要的时候用来维护自身权益。

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。