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.