【发布时间】:2011-08-08 20:01:50
【问题描述】:
我正在尝试创建二进制文件(flv/f4v 等)的校验和,以验证服务器和客户端计算机之间的文件内容。在客户端计算机上运行的应用程序是基于 python 的,而服务器使用的是 PHP。
PHP代码如下:
$fh = fopen($filepath, 'rb');
$contents = fread($fh, filesize($filepath));
$checksum = md5(base64_encode($contents));
fclose($fh);
Python代码如下:
def _get_md5(filepath):
fh = open(filepath, 'rb')
md5 = hashlib.md5()
md5.update(f.read().encode('base64'))
checksum = md5.hexdigest()
f.close()
return checksum
在我正在测试的特定文件上,PHP 和 Python md5 哈希字符串分别如下:
cfad0d835eb88e5342e843402cc42764
0a96e9cc3bb0354d783dfcb729248ce0
服务器运行 CentOS,而客户端是 MacOSX 环境。我将不胜感激任何帮助理解为什么两者会产生不同的哈希结果,或者如果它是我忽略的东西(我对 Python 比较陌生......)。谢谢!
[事后分析:问题归根结底是 Python 和 PHP 的 base64 编码变体之间的差异。 MD5 在两个脚本平台之间的工作方式相同(至少在 Python 中使用 .hexdigest())。]
【问题讨论】:
-
我很确定文件的base64表示不同,而不是md5算法,你能检查一下吗?
-
为什么要使用 base64 呢?为什么不只是 md5 原始二进制文件?
-
你有什么理由首先对文件的内容进行base64编码? md5 函数也会很高兴地处理原始二进制数据。正如 htf 所建议的,从等式中删除 base64 并看看会发生什么。如果出于某种原因,python 和 php 行包装 base64 数据(例如,用于电子邮件插入),并选择了不同的包装点,那会抛出散列并且你永远不会知道,因为你没有检查 base64 输出平等优先。
-
感谢大家的及时回复!我去掉了 base64 编码步骤,现在它似乎可以完美地工作了。我什至不知道为什么我首先使用 base64 编码,我想我可能是为了规范化内容而这样做的,它不可避免地最终变得更糟,哈哈。问题解决了!谢谢!
-
@user715565 在 SO 上将问题标记为“已解决”的方法是接受最能解决问题的答案(单击答案分数下的复选标记)