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

时间:2011-04-19 16:16:52

标签: php python md5

我正在尝试创建二进制文件(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相对较新......)。谢谢!

[post-tomem:问题最终是Python和PHP的base64编码变体之间的区别。 MD5在两个脚本平台之间的工作方式相同(至少在Python中使用.hexdigest())。]

4 个答案:

答案 0 :(得分:25)

我宁愿假设base64实现不同。

修改

PHP:

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

Python(注意尾随换行符):

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

答案 1 :(得分:14)

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

答案 2 :(得分:4)

问题似乎是你的base-64编码文件数据,改变了二进制数据的结构,在php I belive 中它没有base_64编码文件。

放手一搏:

def md5_file(filename):
    //MD5 Object
    crc = hashlib.md5()
    //File Pointer Object
    fp = open(filename, 'rb')

    //Loop the File to update the hash checksum
    for i in fp:
        crc.update(i)

    //Close the resource
    fp.close()

    //Return the hash
    return crc.hexdigest()

并在PHP中使用md5_file,看看它是否有效。

python取自:http://www.php2python.com/wiki/function.md5-file/

答案 3 :(得分:4)

Python在使用.encode时会在字符串中附加换行符'\ n',因此md5函数的输入字符串是不同的。 Python bug跟踪器中的This问题详细解释了它。请参阅下面的要点:

>>> import base64
>>> s='I am a string'
>>> s.encode('base64')
'SSBhbSBhIHN0cmluZw==\n'
>>> base64.b64encode(s)
'SSBhbSBhIHN0cmluZw=='
>>> s.encode('base64')== base64.b64encode(s)+'\n'
True