Хешлиб хэши не сравниваются должным образом - PullRequest
5 голосов
/ 14 июля 2011

Вот мой код:

import hashlib

real = hashlib.sha512("mom")

status = True

while status:
    inp = raw_input("What's the password?")
    converted = hashlib.sha512(inp)

    if converted == real:
        print "Access granted!"
        status = False
    else:
        print "Access denied."

Я новичок в hashlib, и я просто играю с этим.Я подумал, что это будет сделано, чтобы проверить ввод пользователя в хеш фактического пароля, однако, если вы введете правильный пароль, он все равно выдаст «Доступ запрещен».Кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

10 голосов
/ 14 июля 2011

Вы сравниваете два хэш-объекта, а не просто сравниваете их дайджесты.

Измените if на if converted.digest() == real.digest(), и это должно сработать.

Выполнив if converted == real you 'фактически сравниваем два объекта, которые, хотя они и представляют хеш-объект, который выполняет хеширование для одной и той же вещи, являются разными объектами, и поскольку hashlib хеш-объекты не реализуют __cmp__, __eq__ или __ne__, они возвращаются к сравнению двух объектов по тождеству , которое, поскольку они являются двумя различными объектами, вернет false.

Из ссылки на документ:

ЕслиОперация __cmp__(), __eq__() или __ne__() не определена, экземпляры классов сравниваются по идентификатору объекта («адресу»).

Вы можете увидеть, что эти объекты не реализуют эти операторы, выполнив с ними dir():

>>> test = hashlib.sha512('test')
>>> dir(test)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__',
 '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__sizeof__', '__str__', '__subclasshook__', 'block_size', 'copy', 'digest',
 'digest_size', 'digestsize', 'hexdigest', 'name', 'update']
4 голосов
/ 14 июля 2011

Если сравнить дайджесты, это должно сработать:

if converted.digest() == real.digest():
   ...
2 голосов
/ 14 июля 2011

Вы создаете два разных объекта hashlib, и они не равны.Вам нужно сравнить дайджест:

if converted.digest() == real.digest():
...