Сравните результат из hexdigest () со строкой - PullRequest
5 голосов
/ 27 августа 2010

У меня есть сгенерированный хэш MD5, который я хотел бы сравнить с другим хешем MD5 из строки. Приведенное ниже утверждение неверно, даже если они выглядят одинаково при печати, и должно быть истинным.

hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8"

Google сказал мне, что я должен закодировать результат из hexdigest(), поскольку он не возвращает строку. Однако приведенный ниже код, похоже, тоже не работает.

hashlib.md5("foo").hexdigest().encode("utf-8") == "foo".encode("utf-8")

Ответы [ 3 ]

11 голосов
/ 27 августа 2010

Python 2.7, .hexdigest () возвращает str

>>> hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8"
True
>>> type(hashlib.md5("foo").hexdigest())
<type 'str'>

Python 3.1

.md5 () не принимает юникод (что означает "foo"), поэтомуэто должно быть закодировано в поток байтов.

>>> hashlib.md5("foo").hexdigest()
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    hashlib.md5("foo").hexdigest()
TypeError: Unicode-objects must be encoded before hashing

>>> hashlib.md5("foo".encode("utf8")).hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'

>>> hashlib.md5("foo".encode("utf8")).hexdigest() == 'acbd18db4cc2f85cedef654fccc4a4d8'
True
5 голосов
/ 23 января 2013

Использование == для сравнения хешей, скорее всего, является уязвимостью безопасности.

https://groups.google.com/forum/?fromgroups=#!topic/keyczar-discuss/VXHsoJSLKhM

Возможно, злоумышленник может найти различия во времени, эффективно перебрать пространство ключей и найтизначение, которое пройдет тест на равенство.

2 голосов
/ 27 августа 2010

hexdigest возвращает строку .Ваш первый оператор возвращает True в python-2.x.

В python-3.x вам необходимо закодировать аргумент в функцию md5, в этом случае равенство также True.Без кодирования это повышает TypeError.

...