it-swarm.com.de

Python3 und hmac. Wie man mit Zeichenketten umgeht, die nicht binär sind

Ich hatte ein Skript in Python2, das hervorragend funktionierte.

def _generate_signature(data):
   return hmac.new('key', data, hashlib.sha256).hexdigest()

Wobei Daten die Ausgabe von json.dumps Waren.

Wenn ich nun versuche, dieselbe Art von Code in Python 3) auszuführen, erhalte ich Folgendes:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/hmac.py", line 144, in new
    return HMAC(key, msg, digestmod)
  File "/usr/lib/python3.4/hmac.py", line 42, in __init__
    raise TypeError("key: expected bytes or bytearray, but got %r" %type(key).__name__)
TypeError: key: expected bytes or bytearray, but got 'str'

Wenn ich so etwas wie das Umwandeln des Schlüssels in Bytes versuche:

bytes('key')

Ich bekomme

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding

Ich kämpfe immer noch darum, die Kodierungen in Python 3 zu verstehen.

32

Sie können Byte-Literal verwenden: b'key'

def _generate_signature(data):
    return hmac.new(b'key', data, hashlib.sha256).hexdigest()

Stellen Sie außerdem sicher, dass data auch Bytes enthält. Wenn es beispielsweise aus einer Datei gelesen wird, müssen Sie beim Öffnen der Datei den Modus binary (rb) verwenden.

31
falsetru

Eine alte Frage nicht wiederzubeleben, aber ich wollte etwas hinzufügen, von dem ich glaube, dass es in dieser Antwort fehlt, für die ich keine passende Erklärung/Beispiel für irgendwo anders finden konnte:

OP Aquiles Carattino war mit seinem Versuch, die Zeichenkette in Bytes umzuwandeln, ziemlich nahe dran, aber es fehlte das zweite Argument, die Kodierung der zu konvertierenden Zeichenkette in Bytes.

Wenn jemand eine Zeichenfolge auf andere Weise als durch statische Zuweisung in Bytes konvertieren möchte (z. B. durch Lesen aus einer Konfigurationsdatei oder einer Datenbank), sollte Folgendes funktionieren:

import hmac, hashlib

def _generate_signature(data):
  key = 'key' # Defined as a simple string.
  key_bytes= bytes(key , 'latin-1')
  data_bytes = bytes(data, 'latin-1') # Assumes `data` is also a string.
  return hmac.new(key_bytes, data_bytes , hashlib.sha256).hexdigest()

print(
  _generate_signature('this is my string of data')
)
22
Joshua Burns