Como obter a soma MD5 de uma string usando python?

262

Nos documentos da API do Flickr , você precisa encontrar a soma MD5 de uma sequência para gerar o [api_sig]valor.

Como se gera uma soma MD5 a partir de uma string?

Exemplo do Flickr:

corda: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

Soma MD5: a02506b31c1cd46c2e0b6380fb94eb3d

super9
fonte

Respostas:

252

Para o Python 2.x, use o hashlib do python

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

Resultado: a02506b31c1cd46c2e0b6380fb94eb3d

Ikke
fonte
77
Não tente usar hashlib.md5().update('your string').hexdigest(), ele não funcionará, pois update()retorna Nenhum. Se você deseja uma solução de uma linha, use a resposta de Mark Longair.
Christopher Manning
@ChristopherManning m.hexdigest () retorna um resumo de 32 caracteres. Como obter um resumo de 16 caracteres?
Adil Malik
@ Darwesh tem 32 caracteres porque é a representação hexadecimal, faça um m.digest_sizesobre esse código, o resumo interno já tem 16 bytes.
Baris Demiray 20/09/16
1
@Darwesh você pode simplesmente cortar a corda #m.hexdigest()[:16]
fedterzi 17/10
@ Darwesh De acordo com a RFC 1321 , o MD5 é sempre 16 bytes. Se você quer apenas um resumo de 16 caracteres, pode fazer uma fatia, como disse Baris Demiray.
ryan
569

Você pode fazer o seguinte:

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

No entanto, nesse caso, você provavelmente está melhor usando este útil módulo Python para interagir com a API do Flickr:

... que tratará da autenticação para você.

Documentação oficial de hashlib

Mark Longair
fonte
Eu vi a API. Eu só estava curioso como eu poderia fazer isso de qualquer maneira. Obrigado!
super9
1
hexdigest () retorna um resumo de 32 caracteres. Como obter um resumo de 16 caracteres?
Adil Malik
2
Boa resposta! Posso perguntar por que, no Python 2, não precisamos fazer a codificação utf-8, no entanto, no Python 3, precisamos fazer a codificação. Obrigado. @Mark Longair
Jeff Hu
3
@JeffHu, porque hashlib.md5espera um objeto parecido com bytes
MaxU
1
A versão do Python 3 também deve ser usada no Python 2. @JeffHu expandindo o que o @MaxU disse, a função md5 usa uma bytestring e não aceita unicode. O Python 3 é (corretamente) estrito / explícito e, portanto, um str ( "") é unicode e deve ser codificado em uma bytestring. As strings no python2 podem ser interpretadas como uma string btyestring ou unicode, e a passagem de uma ""string str ( ) é interpretada como uma bytestring. Se a sequência tiver caracteres unicode, isso gerará uma exceção. Codifica uma bytestring vai deixar caracteres ASCII intocado e unicode convertido corretamente
Charles L.
11

Você já tentou usar a implementação MD5 no hashlib ? Observe que os algoritmos de hash geralmente agem nos dados binários, e não nos dados de texto ; portanto, você deve ter cuidado com a codificação de caracteres usada para converter de texto em dados binários antes do hash.

O resultado de um hash também são dados binários - parece que o exemplo do Flickr foi convertido em texto usando codificação hexadecimal. Use a hexdigestfunção no hashlib para obter isso.

Jon Skeet
fonte
hexdigest () retorna um resumo de 32 caracteres. Como obter um resumo de 16 caracteres?
Adil Malik
1
@ Darwesh: Bem, sim, MD5 é de 128 bits, que é de 32 caracteres em hexadecimal. Se você deseja um resumo menor, precisará de um resumo de 64 bits. Isso vai ser muito fraco embora ...
Jon Skeet
3
Try This 
import hashlib
user = input("Enter text here ")
h = hashlib.md5(user.encode())
h2 = h.hexdigest()
print(h2)
Ome Mishra
fonte
3

Você pode usar o bcaractere na frente de uma string literal :

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

Fora:

e5dadf6524624f79c3127e247f04b548
e5dadf6524624f79c3127e247f04b548
prosti
fonte
0

Você pode tentar com

#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
fonte