Wie bekomme ich die MD5-Summe eines Strings mit Python?


262

In den Flickr-API-Dokumenten müssen Sie die MD5-Summe einer Zeichenfolge finden, um den [api_sig]Wert zu generieren .

Wie wird eine MD5-Summe aus einer Zeichenfolge generiert?

Flickrs Beispiel:

Zeichenfolge: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

MD5-Summe: a02506b31c1cd46c2e0b6380fb94eb3d

Antworten:


252

Verwenden Sie für Python 2.x die Python- Hashlib

import hashlib
m = hashlib.md5()
m.update("000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite")
print m.hexdigest()

Ausgabe: a02506b31c1cd46c2e0b6380fb94eb3d


76
Versuchen Sie nicht zu verwenden hashlib.md5().update('your string').hexdigest(), es wird nicht funktionieren, da update()Keine zurückgegeben wird. Wenn Sie eine einzeilige Lösung wünschen, verwenden Sie die Antwort von Mark Longair.
Christopher Manning

@ChristopherManning m.hexdigest () gibt einen 32 Zeichen langen Digest zurück. Wie bekomme ich eine 16 Zeichen lange Zusammenfassung?
Adil Malik

@Darwesh es sind 32 Zeichen, weil es die Hex-Darstellung ist, machen Sie einen m.digest_sizeüber diesem Code, der interne Digest ist bereits 16 Bytes.
Baris Demiray

1
@ Darwesh können Sie einfach die Zeichenfolge schneidenm.hexdigest()[:16]
Fedterzi

@Darwesh Laut RFC 1321 beträgt der MD5 immer 16 Bytes. Wenn Sie nur einen 16 Zeichen langen Digest wollen, können Sie ein Slice machen, wie Baris Demiray sagte.
Ryan

569

Sie können Folgendes tun:

Python 2.x.

import hashlib
print hashlib.md5("whatever your string is").hexdigest()

Python 3.x.

import hashlib
print(hashlib.md5("whatever your string is".encode('utf-8')).hexdigest())

In diesem Fall ist es jedoch wahrscheinlich besser, dieses hilfreiche Python-Modul für die Interaktion mit der Flickr-API zu verwenden:

... die sich für Sie um die Authentifizierung kümmern.

Offizielle Dokumentation von hashlib


Ich habe die API gesehen. Ich war nur neugierig, wie ich es trotzdem machen könnte. Vielen Dank!
Super9

1
hexdigest () gibt einen 32 Zeichen langen Digest zurück. Wie bekomme ich eine 16 Zeichen lange Zusammenfassung?
Adil Malik

2
Gute Antwort! Darf ich fragen, warum wir in Python 2 keine utf-8-Codierung durchführen müssen, in Python 3 jedoch die Codierung. Vielen Dank. @ Mark Longair
Jeff Hu

3
@ JeffHu, weil hashlib.md5erwartet ein
byteähnliches

1
Die Python 3-Version sollte auch in Python 2 verwendet werden. @JeffHu erweitert das, was @MaxU gesagt hat, die md5-Funktion nimmt einen Bytestring und akzeptiert keinen Unicode. Python 3 ist (korrekt) streng / explizit, daher ist ein str ( "") Unicode und muss in einen Bytestring codiert werden. Strings in python2 können entweder als Btyestring- oder als Unicode-String interpretiert werden, und das Übergeben eines str ( "") - Strings wird als Bytestring interpretiert. Wenn die Zeichenfolge Unicode-Zeichen enthält, wird eine Ausnahme ausgelöst. Das Codieren eines Bytestrings lässt ASCII-Zeichen unberührt und konvertiert Unicode korrekt
Charles L.

11

Haben Sie versucht, die MD5-Implementierung in hashlib zu verwenden ? Beachten Sie, dass Hashing-Algorithmen normalerweise eher auf Binärdaten als auf Textdaten wirken. Daher sollten Sie vor dem Hashing vorsichtig sein, welche Zeichencodierung zum Konvertieren von Text in Binärdaten verwendet wird.

Das Ergebnis eines Hashs sind auch Binärdaten - es sieht so aus, als ob das Beispiel von Flickr dann mithilfe von Hex-Codierung in Text konvertiert wurde. Verwenden Sie die hexdigestFunktion in hashlib, um dies zu erhalten.


hexdigest () gibt einen 32 Zeichen langen Digest zurück. Wie bekomme ich eine 16 Zeichen lange Zusammenfassung?
Adil Malik

1
@Darwesh: Nun ja, MD5 ist 128 Bit, das sind 32 Zeichen in Hex. Wenn Sie einen kleineren Digest wünschen, benötigen Sie einen 64-Bit-Digest. Das wird allerdings ziemlich schwach sein ...
Jon Skeet

3
Try This 
import hashlib
user = input("Enter text here ")
h = hashlib.md5(user.encode())
h2 = h.hexdigest()
print(h2)


0

Sie können mit versuchen

#python3
import hashlib
rawdata = "put your data here"
sha = hashlib.sha256(str(rawdata).encode("utf-8")).hexdigest() #For Sha256 hash
print(sha)
mdpass = hashlib.md5(str(sha).encode("utf-8")).hexdigest() #For MD5 hash
print(mdpass)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.