web-dev-qa-db-ja.com

Pythonでsha256ハッシュを使用する方法

パスワードのファイルを読み込もうとしています。次に、各パスワードのハッシュを計算し、それを、パスワードを発見したかどうかを判断するためにすでに持っているハッシュと比較しようとしています。ただし、私が取得し続けるエラーメッセージは、「TypeError:ハッシュする前にUnicodeオブジェクトをエンコードする必要があります」です。これが私のコードです:

from hashlib import sha256

with open('words','r') as f:
    for line in f:

        hashedWord = sha256(line.rstrip()).hexdigest()

        if hashedWord == 'ca52258a43795ab5c89513f9984b8f3d3d0aa61fb7792ecefe8d90010ee39f2':
            print(line + "is one of the words!")

誰かが助けて説明を提供できますか?

18
user3479683

エラーメッセージは、その内容を正確に示しています。Unicode文字列があります。 Unicode文字列をSHA-256ハッシュすることはできません。ハッシュできるのはバイトのみです。

しかし、なぜUnicode文字列があるのですか?テキストモードでファイルを開いているので、Pythonにデフォルトのエンコーディングを使用してそのファイルのバイトをUnicodeにデコードするように暗黙的に要求していることを意味します。生バイト、バイナリモードを使用する必要があります。

つまり、次の行を変更するだけです。

_with open('words','r') as f:
_

…へ:

_with open('words', 'rb') as f:
_

これを修正すると、print行で例外が発生することに気付くでしょう。どうして? bytesstrに追加しようとしているためです。また、スペースが不足していて、ストリップされていない行を印刷しています。 printに2つの引数を使用することで、これらすべてを修正できます(print(line.rstrip(), "is one of the words")のように)。

ただし、_b'\xc3\x85rhus' is one of the words_を出力したい場合は、_Århus is one of the words_のような出力が得られます。これは、文字列ではなくバイトがあるためです。 Pythonはデコードされなくなったため、手動でデコードする必要があります。openにエンコードを指定しない場合に機能することがある同じデフォルトのエンコードを使用するには、decodeを呼び出すだけです。引数なし。したがって:

_print(line.rstrip().decode(), "is one of the words")
_
17
abarnert