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!

posted @ 2017-08-09 20:22  邬峙  阅读(568)  评论(0编辑  收藏  举报