私はコーディングが初めてで、文字列をエンコードしようとして問題に遭遇しました。
>>> 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
ありがとう。
単純な文字列をエンコードしているので、すべての文字列がUnicodeオブジェクトであるPython 3を実行していると推測します。2つのオプションがあります。
"Nobody inspects".encode('utf-8')
マニュアルに示されているように、バイナリ文字列を使用します。
m.update(b"Nobody inspects")
m.update(b" the spammish repetition")
シェルとスクリプトの動作が異なる理由は、スクリプトがエラーで停止するのに対し、シェルでは最後の行が別のコマンドであるが、以前のエラーのために希望どおりに動作しないためです。
私が見つけた解決策は、ハッシュしている行でデータをすぐにエンコードすることです:
hashlib.sha256("a".encode('utf-8')).hexdigest()
それは私のために働いた、それが役立つことを願っています!
Pythonは異なるバージョンであるため、私はPython 2.7を使用します。
hashlib.md5(data)関数では、データパラメータのタイプは「バイト」である必要があります。つまり、ハッシュの前にデータのタイプをバイトに入れる必要があります。
同じ文字列が異なるコーディングシステム(utf8\gbk .....)の下で異なる値を持っているため、ハッシュコード変換前の要件。
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に登録するユーザーと同じです。
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;'