Пакет PHP в Python ('H')
Я перевожу библиотеку аутентификации, написанную на PHP на Python. Это весь устаревший код, оригинальных разработчиков давно уже нет. Они использовали команду PHP "pack", чтобы преобразовать строку в шестнадцатеричный формат с помощью флага "H". Документация PHP описывает это как "шестнадцатеричная строка, сначала большой клев". Я прочитал другой вопрос ( Python-эквивалент php pack), в котором предлагалось использовать binascii.unhexlify(), но это вызывает жалобу, когда я передаю не шестнадцатеричный символ.
Итак, мой вопрос: что делает функция пакета PHP с не шестнадцатеричными символами? Выбрасывает ли он их, или есть дополнительный шаг, который выполняет перевод. Есть ли лучший способ в Python, чем binascii.unhexlify?
Так что упаковываю 'H*'
php -r 'print pack("H*", md5("Dummy String"));'
Возвращает
??????=?PW??
В питоне:
secret = binascii.unhexlify( "Dummy String" )
TypeError: Non-hexadecimal digit found
Спасибо за помощь.
[РЕДАКТИРОВАТЬ]
Так что DJV был принципиально прав. Сначала мне нужно было конвертировать значение в md5, но вот где это интересно. В python библиотека md5 возвращает двоичные данные с помощью метода digest.
В моем случае я мог пропустить все вызовы binascii и просто использовать
md5.md5('Dummy String').digest()
Который в PHP такой же как:
pack ("H *", md5 ("Dummy String"));
Прикольные вещи. Хорошо знать.
1 ответ
Я думаю, что вам нужно наоборот. "Dummy String"
недопустимый номер в hex
, Вы можете hexlify
Это:
>>> binascii.hexlify('Dummy String')
'44756d6d7920537472696e67'
но нет unhexlify
Это. unhexlify
принимает строку в hex
и превращает его в представление ASCII:
>>> binascii.unhexlify('44756d6d7920537472696e67')
'Dummy String'
Что вам нужно, это md5
строка ("Dummy String"
в нашем случае) и unhexlify
это хеш:
import binascii
import hashlib
the_hash = hashlib.md5('Dummy String').hexdigest()
print the_hash
the_unhex = binascii.unhexlify(the_hash)
print the_unhex
Который дает хеш, и необъяснимый хеш:
ec041da9f891c09b3d1617ba5057b3f5
ЛLЬ-ю?=¦PWЁУ
Примечание: хотя вывод не похож на ваш - "??????=?PW??", "PW" и "=" в обоих, я уверен, что это правильно.