Python和PHP之间的MD5哈希差异?

2022-08-30 18:20:01

我正在尝试创建二进制文件(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()。]


答案 1

我宁愿假设 base64 的实现不同。

编辑

菲律宾比索:

php -r 'var_dump(base64_encode(str_repeat("x", 10)));'
string(16) "eHh4eHh4eHh4eA=="

Python(注意尾随换行符):

>>> ("x" * 10).encode('base64')
'eHh4eHh4eHh4eA==\n'

答案 2

PHP 和 python 使用不同的 base64 风格:


推荐