文件HASH是什么东西?如何校验?

in #hash6 years ago

文件HASH

在升级轻钱包的过程中,我们会注意到轻钱包的发布页面上有类似如下内容:


文件名,我们懂,可是后边这一大串数字是啥东西呀?

https://bitshares.org/download/ 页面查看,才知道原来是sha256

也就是说对文件使用sha256算法生成HASH值,通过对比这个值,可以判断文件是否被修改。这个是非常有意义的,比如说我重新打包生成一个轻钱包,加入一点自己的恶意代码,然后发给你,但是你和官网上的hash值一对比,就会发现我这个不是官网原装的,我的不良企图一下子就曝光了。

HASH函数生成HASH值的过程是单向且不可逆,不同的输入总是输出不同的HASH值,所以想修改文件并产生相同的HASH值几乎是可能的。

注:前些年山东大学的王小云教授找出了几组不同的输入可以输出相同的MD5值,所以现在推荐使用更加安全的sha256等算法。

如何校验

上边也说了,要对比生成的HASH值才能判断文件是否被更改。但是如何生成文件的HASH值呢?还记得我们之前学过的hashlib嘛?没错,用它就可以。

在Python交互环境下,示例代码如下:

import hashlib
f = open("./BitShares.Setup.2.0.180201.exe", "rb")
sha256 = hashlib.sha256()
sha256.update(f.read())
sha256.hexdigest()
f.close()

执行结果如下:

是不是超级简单?

对比一下网站上列出的文件HASH,完全一致,说明这文件来源可靠,未被篡改。

更进一步

使用Python交互环境可以胜任这个工作,但是每次都要敲代码终归有些繁琐。所以可以考虑把上述代码做成Python脚本,可以考虑支持三参数:

  • 待校验的文件名
  • 算法:默认为sha256
  • HASH: 网站上给出的文件HASH

如果调用时只给出文件名,那么就生成sha256哈希并显示出来。如果给出了算法和文件HASH,则按指定算法生成HASH,显示出来。并且判断是否与网站列出的HASH值一致。

如果愿意再费点劲,可以考虑支持http开头或者https开头的文件名,程序中判断是网站链接,自动去下载文件再去完成上述步骤,或者弄个网页实现在线校验。

代码我就不去写了,以免写不出来或者写不好丢人😳。

参考链接

https://docs.python.org/3.6/library/hashlib.html
https://en.wikipedia.org/wiki/File_verification
https://en.wikipedia.org/wiki/Hash_function
https://en.wikipedia.org/wiki/Cryptographic_hash_function
https://en.wikipedia.org/wiki/MD5

封面图源:pixabay

Sort:  

Nice article

Your articles are very helpful to me, thanks, success always

We can be friends

不错不错 大神多多指教

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.032
BTC 64266.51
ETH 3121.56
USDT 1.00
SBD 4.08