FreedomLy's blog.

【每周一坑】校验文件哈希

字数统计: 611阅读时长: 2 min
2017/06/09 Share

hash

我们经常看到软件的下载页面会注明这个软件的哈希值。可能你从没注意,但这其实是个蛮重要的东西,它可以用来验证你下载的软件是否被人动过手脚。
早些时候Mac上爆出XCodeGhost木马事件,引发的一个重要环节就是因为部分开发人员既没有从官方渠道下载,也没有验证软件哈希值,以至于使用了被植入代码的开发工具。

问题

请使用Python写一个小程序,用来计算指定文件的哈希值。

附加题

可以指定哈希加密算法,并让程序尽可能简单易用。

思路

问题挺简单,可以使用hashlib这个库来生成哈希值。之前也用到过这个库【每周一坑】程序员的浪漫,具体用法在之前的文章中也讲过了。

Python实现

计算哈希值的函数

1
2
3
4
5
6
7
8
9
# 计算哈希值
def generate_hash(file):
with open(file, 'rb') as f:
s = f.read()
md5 = hashlib.md5(s).hexdigest() # 生成MD5
sha1 = hashlib.sha1(s).hexdigest() # 生成SHA1
sha256 = hashlib.sha256(s).hexdigest() # 生成SHA256
sha512 = hashlib.sha512(s).hexdigest() # 生成SHA512
return md5, sha1, sha256, sha512

可以指定哈希加密算法的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 计算哈希值
def generate_hash_type(file, hash_type):
with open(file, 'rb') as f:
s = f.read()
if hash_type.lower() == 'md5':
hash_res = hashlib.md5(s).hexdigest()
elif hash_type.lower() == 'sha1':
hash_res = hashlib.sha1(s).hexdigest()
elif hash_type.lower() == 'sha256':
hash_res = hashlib.sha256(s).hexdigest()
elif hash_type.lower() == 'sha512':
hash_res = hashlib.sha512(s).hexdigest()
else:
print("Hash type error!")
hash_res = "Type Error"
return hash_type, hash_res

测试程序

1
2
3
4
5
6
7
if __name__ == '__main__':
file_path, hash_t = map(str, input('Please enter the path of the file and hash type:').split())
md = generate_hash_type(file_path, hash_t)
print(md,'\n')
md = generate_hash(file_path)
for i in md:
print(i)

最后别忘了引入hashlib库:

1
import hashlib

还有设置编码格式以防万一

1
# -*- coding: utf-8 -*-

测试

这里我使用的是Python官网下载的python-3.6.1-amd64.exe做的测试,官网也给出了它的md5哈希值,方便校验。
首先是用generate_hash()函数,分别生成md5,sha1,sha256sha512的校验码:

1
2
>>> please enter the path of the file:
>>> 文件路径,我这里是 C:\Users\Freed\Downloads\python-3.6.1-amd64.exe

输出结果为:

md5
ad69fdacde90f2ce8286c279b11ca188
sha1
bf54252c4065b20f4a111cc39cf5215fb1edccff
sha256
591922fbf5c4234b766dd672e539cba3d9a158e028e3c85c76bfec6ede56ded8
sha512
f0abf85afaf53eb7b706c17c3d8087d81fa57c397099f403f9d51dbd60c4e7
b9ad9e79fc375dadcccf74d32eba8653b139e073d84c5eb0d03f35313a5c4c6873

然后是输入路径+指定加密算法:

1
2
>>> please enter the path of the file and hash type:
>>> C:\Users\Freed\Downloads\python-3.6.1-amd64.exe md5

输出结果为:

(‘md5’, ‘ad69fdacde90f2ce8286c279b11ca188’)

再来看看官网给出的md5:

ad69fdacde90f2ce8286c279b11ca188

和程序计算的结果一致。

End~


CATALOG
  1. 1. 问题
  2. 2. 思路
  3. 3. Python实现
    1. 3.1. 计算哈希值的函数
    2. 3.2. 可以指定哈希加密算法的函数
    3. 3.3. 测试程序
  4. 4. 测试