6

これが私のコードです:

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を初めて使用し、それをいじっているだけです。これが行うと思ったのは、実際のパスワードのハッシュに入力されたユーザーを検証することですが、正しいパスワードを入力すると、「アクセスが拒否されました」というメッセージが表示されます。誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

14

ダイジェストを比較するだけでなく、2 つのハッシュ オブジェクトを比較しています。

に変更するifif converted.digest() == real.digest()、うまくいくはずです。

実行if converted == realすることで、実際には2つのオブジェクトを比較しています.2つのオブジェクトは同じものにハッシュするハッシュオブジェクトを表していますが、それらは異なるオブジェクトであり、ハッシュオブジェクトは、、またはをhashlib実装していないため、2つのオブジェクトの比較にフォールバックしますこれらは 2 つの別個のオブジェクトであるため、false を返します__cmp____eq____ne__

ドキュメントリンクから:

no の場合__cmp__()__eq__()または__ne__()操作が定義されている場合、クラス インスタンスはオブジェクト ID (「アドレス」) によって比較されます。

これらのオブジェクトで a を実行すると、これらのオブジェクトがこれらの演算子を実装していないことがわかり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']
于 2011-07-14T15:19:50.573 に答える
4

ダイジェストを比較すると、うまくいくはずです:

if converted.digest() == real.digest():
   ...
于 2011-07-14T15:20:13.943 に答える
2

2 つの異なる hashlib オブジェクトを作成していますが、それらは等しくありません。必要なのは、ダイジェストを比較することです。

if converted.digest() == real.digest():
于 2011-07-14T15:23:25.883 に答える