Проблемы с кодировкой символов при генерации кросс-платформенного хэша MD5 - PullRequest
1 голос
/ 26 марта 2010

Это общий вопрос о кодировке символов при использовании библиотек MD5 на разных языках. Меня беспокоит: предположим, я сгенерировал хеш MD5 с использованием нативного строкового объекта Python, например:

message = "hello world"
m = md5()
m.update(message)

Затем я беру шестнадцатеричную версию этого MD5-хеша, используя:

m.hexdigest()

и отправьте сообщение и MD5-хеш через сеть, скажем, через JMS-сообщение или HTTP-запрос.

Теперь я получаю это сообщение в программе на Java в виде нативной строки Java вместе с контрольной суммой. Затем я генерирую хеш MD5 с использованием Java, например, так (используя библиотеку кодеков Commons):

String md5 = org.apache.commons.codec.digest.DigestUtils.DigestUtils.md5Hex(s)

Мне кажется, что это неправильно, потому что я не указал кодировку символов на обоих концах. Таким образом, оригинальный хеш будет основан на байтах Python-версии строки; Java будет основываться на байтах Java-версии строки, эти две последовательности байтов часто не будут одинаковыми - это правда? Так что на самом деле мне нужно указать "UTF-8" или что-то еще на обоих концах, верно?

(На самом деле я получаю неустойчивую ошибку в моем коде, когда контрольная сумма MD5 не срабатывает, и я подозреваю, что это причина - но поскольку она прерывистая, трудно сказать, если это исправить, исправить это или нет.)

Спасибо!

Ответы [ 2 ]

1 голос
/ 26 марта 2010

Да, вы должны быть явными, поскольку контрольная сумма MD5 находится в последовательности БАЙТОВ, а не Символов. Поэтому вам нужен предсказуемый перевод символов в байты.

0 голосов
/ 26 марта 2010

Да, лучше хешировать одну и ту же кодировку на обоих концах. Декодируйте строку Python в Unicode, прежде чем кодировать.

...