Comment obtenir la somme MD5 d'une chaîne en utilisant python?


262

Dans les documents de l'API Flickr , vous devez trouver la somme MD5 d'une chaîne pour générer la [api_sig]valeur.

Comment générer une somme MD5 à partir d'une chaîne?

Exemple de Flickr:

chaîne: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

Somme MD5: a02506b31c1cd46c2e0b6380fb94eb3d

Réponses:


252

Pour Python 2.x, utilisez le hashlib de python

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

Production: a02506b31c1cd46c2e0b6380fb94eb3d


77
N'essayez pas d'utiliser hashlib.md5().update('your string').hexdigest(), cela ne fonctionnera pas car update()retourne Aucun. Si vous voulez une solution à une ligne, utilisez la réponse de Mark Longair.
Christopher Manning,

@ChristopherManning m.hexdigest () renvoie un résumé long de 32 caractères. Comment obtenir un résumé long de 16 caractères?
Adil Malik

@ Darwesh c'est 32 caractères parce que c'est la représentation hexadécimale, faites un m.digest_sizeau-dessus de ce code, le résumé interne est déjà 16 octets.
Baris Demiray

1
@ Darwesh, vous pouvez simplement couper la chaînem.hexdigest()[:16]
fedterzi

@ Darwesh Selon la RFC 1321 , le md5 fait toujours 16 octets. Si vous voulez juste un résumé de 16 caractères, vous pouvez faire une tranche comme l'a dit Baris Demiray.
Ryan

569

Vous pouvez effectuer les opérations suivantes:

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

Cependant, dans ce cas, vous feriez probablement mieux d'utiliser ce module Python utile pour interagir avec l'API Flickr:

... qui s'occupera de l'authentification pour vous.

Documentation officielle de hashlib


J'ai vu l'API. J'étais simplement curieux de savoir comment je pouvais le faire de toute façon. Merci!
super9

1
hexdigest () renvoie un résumé de 32 caractères. Comment obtenir un résumé long de 16 caractères?
Adil Malik

2
Bonne réponse! Puis-je demander pourquoi en Python 2 nous n'avons pas besoin de faire l'encodage utf-8, cependant en Python 3 nous devons faire l'encodage. Merci. @Mark Longair
Jeff Hu

3
@JeffHu, car hashlib.md5attend un objet de type
octet

1
La version Python 3 doit également être utilisée dans Python 2. @JeffHu développant ce que @MaxU a dit, la fonction md5 prend un bytestring et n'accepte pas l'unicode. Python 3 est (correctement) strict / explicite, et donc un str ( "") est unicode et doit être codé en bytestring. Les chaînes en python2 peuvent être interprétées comme une chaîne btyestring ou unicode, et passer une ""chaîne str ( ) est interprété comme une chaîne bytestring. Si la chaîne a des caractères unicode, cela déclenchera une exception. Encoder un bytestring laissera les caractères ascii intacts et convertira correctement l'unicode
Charles L.

11

Avez-vous essayé d'utiliser l'implémentation MD5 dans hashlib ? Notez que les algorithmes de hachage agissent généralement sur les données binaires plutôt que sur les données texte , vous pouvez donc faire attention au codage de caractères utilisé pour convertir du texte en données binaires avant le hachage.

Le résultat d'un hachage est également des données binaires - il semble que l'exemple de Flickr a ensuite été converti en texte à l'aide d'un codage hexadécimal. Utilisez la hexdigestfonction dans hashlib pour l'obtenir.


hexdigest () renvoie un résumé de 32 caractères. Comment obtenir un résumé long de 16 caractères?
Adil Malik

1
@ Darwesh: Eh bien oui, MD5 est de 128 bits, soit 32 caractères en hexadécimal. Si vous souhaitez un résumé plus petit, vous aurez besoin d'un résumé 64 bits. Ce sera quand même assez faible ...
Jon Skeet

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

3

Vous pouvez utiliser un bcaractère devant un littéral de chaîne :

import hashlib
print(hashlib.md5(b"Hello MD5").hexdigest())
print(hashlib.md5("Hello MD5".encode('utf-8')).hexdigest())

En dehors:

e5dadf6524624f79c3127e247f04b548
e5dadf6524624f79c3127e247f04b548

0

Vous pouvez essayer avec

#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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.