MD5 хэш расхождение между Python и PHP? - PullRequest
23 голосов
/ 19 апреля 2011

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

Ответы [ 4 ]

25 голосов
/ 19 апреля 2011

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

EDIT

PHP:

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

Python (обратите внимание на завершающий перевод строки):

>>> ("x" * 10).encode('base64')
'eHh4eHh4eHh4eA==\n'
14 голосов
/ 19 апреля 2011

PHP и python используют разные варианты base64:

4 голосов
/ 19 апреля 2011

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
4 голосов
/ 19 апреля 2011

Кажется, проблема в том, что ваша 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 и посмотрите, будет ли это работать соответствующим образом.

питон взят из: http://www.php2python.com/wiki/function.md5-file/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...