python hashlib库在window与linux下—对同一个文件加密结果不同?
在使用hashlib 偶然发现这个问题,一个简单的程序sha256.py如下:
1 #-*- coding:utf-8 -*- 2 import hashlib,sys 3 sha256=hashlib.sha256() 4 with open(sys.argv[1],'r') as fr: 5 for each in fr: 6 sha256.update(each) 7 hash_value=sha256.hexdigest() 8 print hash_value
加密文件,一个简单的压缩文件 aa.tar.gz
window上调用sha256.py 结果如下:
linux上调用sha256.py 与使用sha256sum 命令加密结果如下:
为什么会这样,是sha256 有错,还是Python这个库有问题?都不是,原因在 Python 的with open(path,'r ') 中的好意:
对于一般的文本文件,使用r模式,python 会默认做一些处理,比如,将本应该读入的\r\n 处理成\n, 方便处理,这无可厚非,而且一般而言,with open() 也就是用来处理文本文件的。
但是如果文件的字里行间,尤其是非文本文件,这样读取就会造成文件内容改变,导致加密结果不同,所以在跨平台使用hashlib 的时候建议使用rb 模式,该模式不会对文件做多与处理,造成内容改变。
将代码改成如下:
1 #-*- coding:utf-8 -*- 2 import hashlib,sys 3 sha256=hashlib.sha256() 4 # just change 'r' to 'rb' 5 with open(sys.argv[1],'rb') as fr: 6 for each in fr: 7 sha256.update(each) 8 hash_value=sha256.hexdigest() 9 print hash_value
运行结果如下:
加密结果相同,OK!