Подтвердить что ты не робот

Различие между хешем MD5 между Python и PHP?

Я пытаюсь создать контрольную сумму двоичного файла (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 mortem: проблема была в конечном счете различием между классами кодирования Python и PHP base64. MD5 работает одинаково между двумя платформами сценариев (по крайней мере, используя .hexdigest() в Python).]

4b9b3361

Ответ 1

Я предпочел бы, что реализации base64 отличаются.

ИЗМЕНИТЬ

PHP:

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

Python (обратите внимание на конечную новую строку):

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

Ответ 3

Проблема заключается в том, что ваша базовая 64-кодировка данных файла, изменение структуры двоичных данных, в php Я верю, что он не кодирует файл 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/

Ответ 4

Python добавляет новую строку '\n' в строку при использовании .encode, поэтому входные строки для функции md5 различаются. Этот вопрос в Python отладчике ошибок объясняет это подробно. См. Ниже его суть:

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