web-dev-qa-db-ja.com

hashlib.md5()TypeError:ハッシュする前にUnicodeオブジェクトをエンコードする必要があります

私はコーディングが初めてで、文字列をエンコードしようとして問題に遭遇しました。

>>> import hashlib
>>> a = hashlib.md5()
>>> a.update('hi')
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    a.update('hi')
TypeError: Unicode-objects must be encoded before hashing
>>> a.digest()
b'\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\t\x98\xec\xf8B~'

(a)現在エンコードされていると見なされていますか?

2番目の質問:スクリプトで上記と同じコードを実行すると、次のエラーが表示されます。

import hashlib
a = hashlib.md5()
a.update('hi')
a.digest()

トレースバック(最後の最後の呼び出し):ファイル "C:/ Users/User/Desktop/Logger/Encoding practice.py"、3行目、a.update( 'hi')TypeError:ハッシュする前にUnicodeオブジェクトをエンコードする必要があります

スクリプトではなくシェルでコードが機能するのはなぜですか?私はWindowsで作業していますPython 3.4

ありがとう。

19
Shahab

単純な文字列をエンコードしているので、すべての文字列がUnicodeオブジェクトであるPython 3を実行していると推測します。2つのオプションがあります。

  1. 文字列のエンコードを指定します。例:"Nobody inspects".encode('utf-8')
  2. マニュアルに示されているように、バイナリ文字列を使用します。

    m.update(b"Nobody inspects")
    m.update(b" the spammish repetition")
    

シェルとスクリプトの動作が異なる理由は、スクリプトがエラーで停止するのに対し、シェルでは最後の行が別のコマンドであるが、以前のエラーのために希望どおりに動作しないためです。

18
Steve Barnes

私が見つけた解決策は、ハッシュしている行でデータをすぐにエンコードすることです:

hashlib.sha256("a".encode('utf-8')).hexdigest()

それは私のために働いた、それが役立つことを願っています!

18
Matej Butković

Pythonは異なるバージョンであるため、私はPython 2.7を使用します。

hashlib.md5(data)関数では、データパラメータのタイプは「バイト」である必要があります。つまり、ハッシュの前にデータのタイプをバイトに入れる必要があります。

同じ文字列が異なるコーディングシステム(utf8\gbk .....)の下で異なる値を持っているため、ハッシュコード変換前の要件。

2
NeoWu

Python3の場合、次のように機能しました。

secretKey = b"secret key that you get from Coginito -> User Pool -> General Settings -> App Clients-->Click on Show more details -> App client secret"
        clientId = "Coginito -> User Pool -> General Settings -> App Clients-->App client id"
        digest = hmac.new(secretKey,
                  msg=(user_name + clientId).encode('utf-8'),
                  digestmod=hashlib.sha256
                 ).digest()
        signature = base64.b64encode(digest).decode()

上記のユーザー名user_nameは、cognitoに登録するユーザーと同じです。

1
Haris Np

REPLでは機能していません。ハッシュに有効なものを渡していないため、ハッシュされません。最初にエンコードしてみてください。

3>> hashlib.md5().digest()
b'\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\t\x98\xec\xf8B~'
3>> a = hashlib.md5()
3>> a.update('hi'.encode('utf-8'))
3>> a.digest()
b'I\xf6\x8a\\\x84\x93\xec,\x0b\xf4\x89\x82\x1c!\xfc;'