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!

转载于:https://www.cnblogs.com/zeusmyth/p/7327516.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值