¿Cómo obtener la suma MD5 de una cadena usando python?

262

En los documentos de la API de Flickr , debe encontrar la suma MD5 de una cadena para generar el[api_sig] valor.

¿Cómo se genera una suma MD5 a partir de una cadena?

El ejemplo de Flickr:

cuerda: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

Suma MD5: a02506b31c1cd46c2e0b6380fb94eb3d

super9
fuente

Respuestas:

252

Para Python 2.x, use el hashlib de python

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

Salida: a02506b31c1cd46c2e0b6380fb94eb3d

Ikke
fuente
77
No intente usarlo hashlib.md5().update('your string').hexdigest(), no funcionará ya que update()devuelve Ninguno. Si desea una solución de una línea, use la respuesta de Mark Longair.
Christopher Manning
@ChristopherManning m.hexdigest () devuelve un resumen de 32 caracteres de longitud. ¿Cómo obtener un resumen de 16 caracteres de largo?
Adil Malik
@Darwesh tiene 32 caracteres porque es la representación hexadecimal, haz una m.digest_sizeparte de este código, el resumen interno ya tiene 16 bytes.
Baris Demiray
1
@ Darwesh, simplemente puedes cortar la cuerdam.hexdigest()[:16]
fedterzi
@Darwesh Según RFC 1321 , el md5 siempre tiene 16 bytes. Si solo quieres un resumen de 16 caracteres, puedes hacer un corte como dijo Baris Demiray.
Ryan
569

Puedes hacer lo siguiente:

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

Sin embargo, en este caso, probablemente sea mejor usar este útil módulo de Python para interactuar con la API de Flickr:

... que se ocupará de la autenticación por usted.

Documentación oficial de hashlib

Mark Longair
fuente
Vi la API. Tenía curiosidad de cómo podría hacerlo de todos modos. ¡Gracias!
super9
1
hexdigest () devuelve un resumen de 32 caracteres de longitud. ¿Cómo obtener un resumen de 16 caracteres de largo?
Adil Malik
2
¡Buena respuesta! ¿Puedo preguntar por qué en Python 2 no necesitamos hacer codificación utf-8? Sin embargo, en Python 3 necesitamos hacer la codificación. Gracias. @Mark Longair
Jeff Hu
3
@JeffHu, porque hashlib.md5espera un objeto similar a bytes
MaxU
1
La versión de Python 3 también debería usarse en Python 2. @JeffHu expandiendo lo que dijo @MaxU, la función md5 toma una cadena de bytes y no acepta unicode. Python 3 es (correctamente) estricto / explícito, por lo que un str ( "") es unicode y debe codificarse en una cadena de bytes. Las cadenas en python2 pueden interpretarse como una cadena btyestring o unicode, y pasar una cadena str ( "") se interpreta como una cadena de bytes. Si la cadena tiene caracteres unicode, esto generará una excepción. La codificación de una cadena de bytes dejará los caracteres ascii intactos y se convertirá correctamente en Unicode
Charles L.
11

¿Has intentado usar la implementación MD5 en hashlib ? Tenga en cuenta que los algoritmos de hash generalmente actúan sobre datos binarios en lugar de texto , por lo que es posible que tenga cuidado con la codificación de caracteres que se utiliza para convertir de texto a datos binarios antes del hash.

El resultado de un hash también son datos binarios: parece que el ejemplo de Flickr se ha convertido en texto mediante codificación hexadecimal. Use la hexdigestfunción en hashlib para obtener esto.

Jon Skeet
fuente
hexdigest () devuelve un resumen de 32 caracteres de longitud. ¿Cómo obtener un resumen de 16 caracteres de largo?
Adil Malik
1
@ Darwesh: Bueno, sí, MD5 tiene 128 bits, que tiene 32 caracteres en hexadecimal. Si desea un resumen más pequeño, necesitará un resumen de 64 bits. Sin embargo, eso será bastante débil ...
Jon Skeet
3
Try This 
import hashlib
user = input("Enter text here ")
h = hashlib.md5(user.encode())
h2 = h.hexdigest()
print(h2)
Ome Mishra
fuente
3

Puedes usar bcaracteres delante de un literal de cadena :

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

Fuera:

e5dadf6524624f79c3127e247f04b548
e5dadf6524624f79c3127e247f04b548
prosti
fuente
0

Puedes probar 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)
Md Jewele Islam
fuente