Hash MD5 em Python
Este artigo demonstrará como usar o hash MD5 usando o módulo Python hashlib
.
O que é Hash?
Um hash é uma função que pega dados de comprimento variável e os converte em um comprimento fixo. O valor retornado de uma função hash é chamado de valor hash, código hash ou resumo. Os valores de hash são geralmente usados para indexar uma tabela de tamanho fixo chamada de tabela de hash.
O que é MD5?
O algoritmo de resumo da mensagem MD5 é uma função hash popular que produz um valor hash de 128 bits. Inicialmente projetado como uma função hash criptográfica, agora é comumente usado para verificar a integridade dos dados devido a vários problemas de segurança e vulnerabilidades.
Módulo Python hashlib
A biblioteca padrão do Python consiste em um módulo que implementa muitos algoritmos de hash seguro e de resumo de mensagem chamados hashlib
. Também pode incluir algoritmos adicionais disponíveis, dependendo da biblioteca OpenSSL que o Python usa em sua plataforma.
Para usar os algoritmos de hash, importe o módulo hashlib
.
import hashlib
Agora podemos usar os algoritmos de hash suportados por este módulo. Para verificar os algoritmos de hash disponíveis no interpretador Python em execução, use o atributo constante algorithms_available
.
import hashlib
print(hashlib.algorithms_available)
Resultado:
{'md5', 'blake2s', 'sha256', 'sha384', 'sha3_512', 'blake2b', 'md4', 'md5-sha1', 'sha512_224', 'sha224', 'sha3_224', 'ripemd160', 'sha3_256', 'shake_256', 'sm3', 'shake_128', 'sha3_384', 'sha1', 'sha512_256', 'whirlpool', 'sha512'}
A lista acima são os algoritmos disponíveis em hashlib
, incluindo algoritmos disponíveis de OpenSSL
Para verificar os algoritmos hash com garantia de suporte em todas as plataformas por este módulo, use o atributo constante algorithms_guaranteed
.
import hashlib
print(hashlib.algorithms_guaranteed)
Resultado:
{'sha3_256', 'sha256', 'sha3_224', 'sha224', 'blake2s', 'sha3_512', 'shake_128', 'sha512', 'sha3_384', 'shake_256', 'md5', 'blake2b', 'sha384', 'sha1'}
Nota: md5
está na lista de algorithms_guaranteed
, mas alguns fornecedores upstream compatíveis com FIPS oferecem uma compilação Python que o exclui.
Use o algoritmo MD5 em Python
Para usar o algoritmo md5, usaremos o construtor md5()
e alimentaremos o objeto hash com objetos semelhantes a bytes usando o método update()
ou passaremos os dados como um parâmetro do construtor.
Para obter o valor hash, use o método digest()
, que retorna um resumo do objeto bytes
dos dados alimentados para o objeto hash.
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b"Hello World")
print(md5_hash.digest())
Resultado:
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
Você também pode passar os dados como um parâmetro para o construtor e obter o valor de hash
import hashlib
print(hashlib.md5(b"Hello World").digest())
Resultado:
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
Semelhante ao método digest()
, você também pode usar hexdigest()
, que retorna um objeto string do resumo contendo apenas dígitos hexadecimais.
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b"Hello World")
print(md5_hash.hexdigest())
Resultado:
b10a8db164e0754105b7a99be72e3fe5
Observe que há um b
antes do literal de string ser passado para o método update()
. É usado para criar uma instância do tipo bytes
em vez do tipo str
. Como a função de hash só aceita uma sequência de bytes como parâmetro. A passagem de objetos string para o método update()
não é suportada.
Você também pode fazer várias chamadas para o método update()
, que é equivalente a uma única chamada com todos os argumentos sendo concatenados.
import hashlib
first_hash = hashlib.md5()
first_hash.update(b"Hello World, Hello Python")
print(first_hash.hexdigest())
second_hash = hashlib.md5()
second_hash.update(b"Hello World,")
second_hash.update(b" Hello Python")
print(second_hash.hexdigest())
Resultado:
b0f2921c8c0e63898b0388777908893a
b0f2921c8c0e63898b0388777908893a
Em resumo, podemos usar o algoritmo de hash md5
através do módulo hashlib
que pode ser alimentado com dados passando-o como um parâmetro do construtor md5()
ou usando o método update()
. Podemos obter o valor hash usando o método digest()
, que retorna um objeto bytes
do método digest()
ou hexdigest()
, que retorna um objeto string do digest contendo apenas dígitos hexadecimais.