Come ottenere la somma MD5 di una stringa usando Python?


262

Nei documenti dell'API di Flickr , è necessario trovare la somma MD5 di una stringa per generare il [api_sig]valore.

Come si fa a generare una somma MD5 da una stringa?

Esempio di Flickr:

corda: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

Somma MD5: a02506b31c1cd46c2e0b6380fb94eb3d

Risposte:


252

Per Python 2.x, usa l' hashlib di python

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

Produzione: a02506b31c1cd46c2e0b6380fb94eb3d


77
Non provare a utilizzare hashlib.md5().update('your string').hexdigest(), non funzionerà poiché update()restituisce None. Se vuoi una soluzione a una riga, usa la risposta di Mark Longair.
Christopher Manning,

@ChristopherManning m.hexdigest () restituisce un digest lungo 32 caratteri. Come ottenere un digest lungo 16 caratteri?
Adil Malik,

@Darwesh ha 32 caratteri perché è la rappresentazione esadecimale, m.digest_sizeoltre a questo codice, il digest interno è già di 16 byte.
Baris Demiray

1
@Darwesh puoi semplicemente tagliare la stringam.hexdigest()[:16]
fedterzi,

@Darwesh Secondo RFC 1321 , il md5 è sempre di 16 byte. Se vuoi solo un digest lungo di 16 caratteri, puoi fare una fetta come ha detto Baris Demiray.
Ryan,

569

Puoi fare quanto segue:

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())

Tuttavia, in questo caso probabilmente stai meglio usando questo utile modulo Python per interagire con l'API di Flickr:

... che si occuperà dell'autenticazione per te.

Documentazione ufficiale di hashlib


Ho visto l'API. Ero solo curioso di come avrei potuto farlo comunque. Grazie!
super9

1
hexdigest () restituisce un digest lungo 32 caratteri. Come ottenere un digest lungo 16 caratteri?
Adil Malik,

2
Bella risposta! Posso chiederti perché in Python 2 non abbiamo bisogno di fare la codifica utf-8, tuttavia in Python 3 dobbiamo fare la codifica. Grazie. @Mark Longair
Jeff Hu,

3
@JeffHu, perché si hashlib.md5aspetta un byte-like-object
MaxU

1
La versione di Python 3 dovrebbe essere usata anche in Python 2. Espandendo @JeffHu su ciò che ha detto @MaxU, la funzione md5 accetta una decodifica e non accetta l'unicode. Python 3 è (correttamente) rigoroso / esplicito, quindi un str ( "") è unicode e deve essere codificato in bytestring. Le stringhe in python2 possono essere interpretate come una stringa btyestring o unicode e il passaggio di una ""stringa str ( ) viene interpretato come bytestring. Se la stringa ha caratteri unicode, ciò genererà un'eccezione. La codifica di un bytestring lascerà intatti i caratteri ASCII e convertirà unicode correttamente
Charles L.

11

Hai provato a utilizzare l'implementazione MD5 in hashlib ? Si noti che gli algoritmi di hashing in genere agiscono sui dati binari anziché sui dati di testo , quindi è consigliabile prestare attenzione a quale codifica dei caratteri viene utilizzata per convertire da testo a dati binari prima dell'hash.

Il risultato di un hash sono anche dati binari: sembra che l'esempio di Flickr sia stato quindi convertito in testo usando la codifica esadecimale. Usa la hexdigestfunzione in hashlib per ottenere questo.


hexdigest () restituisce un digest lungo 32 caratteri. Come ottenere un digest lungo 16 caratteri?
Adil Malik,

1
@Darwesh: beh sì, MD5 ha 128 bit, ovvero 32 caratteri in esadecimale. Se vuoi un digest più piccolo, avrai bisogno di un digest a 64 bit. Sarà piuttosto debole però ...
Jon Skeet,

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


0

Puoi provare con

#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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.