Artigo original: MD5 vs SHA-1 vs SHA-2 - Which is the Most Secure Encryption Hash and How to Check Them

O que é uma função hash?

Uma função hash recebe um valor de entrada (como uma string, por exemplo) e retorna um valor de comprimento fixo. Uma função hash ideal tem as seguintes propriedades:

  • É rápida (em inglês)
  • É capaz de retornar uma quantidade enorme de valores hash
  • Gera valores únicos de hash para cada entrada (sem colisões)
  • Gera diferentes de hash para valores de entrada similares
  • Os valores hash não tem padrão discernível em sua distribuição (em inglês)

Não existe uma função hash ideal, claro, mas cada uma procura operar o mais perto possível do ideal. Dado que (em grande parte) as funções de hash retornam valores de comprimento fixo e que o intervalo de valores é, portanto, restrito, essa restrição pode ser praticamente ignorada. O número de valores possíveis que podem ser retornados por uma função hash de 256 bits, por exemplo, é aproximadamente o mesmo número de átomos no universo (em inglês).

Idealmente, uma função hash não retorna colisões, praticamente - dito isso, dois valores de entrada não geram hashes iguais. Isso é particularmente importante para funções hash de criptografia: colisões de hashes são consideradas vulnerabilidades (em inglês).

Por fim, uma função hash deve gerar valores imprevisíveis para cada valor de entrada. Por exemplo, observe as duas sentenças abaixo com valores similares:

1. "The quick brown fox."
2. "The quick brown fax."

Podemos comparar os valores hash gerados em MD5 para cada uma das duas sentenças:

1. 2e87284d245c2aae1c74fa4c50a74c77
2. c17b6e9b160cda0cf583e89ec7b7fc22

Dois valores diferentes foram gerados para duas sentenças similares, o que é uma propriedade muito útil para validação e para a criptografia. Isso é um corolário de uma distribuição (em inglês): os valores hash de todas as entradas deveriam propagar de maneira uniforme e imprevisível em todo o intervalo de valores possíveis de hash.

Funções hash comuns

Existem diversas funções hash amplamente usadas. Todas foram desenhadas por matemáticos e cientistas da computação.  Ao longo de mais pesquisas, algumas mostraram ter alguns pontos fracos. Ainda assim, foram consideradas boas o suficiente para aplicações não criptográficas.

MD5

Uma função hash MD5 produz valores hash de 128 bits. Ela foi projetada para uso criptográfico, mas algumas vulnerabilidades foram descobertas no mesmo período e, por conta disso, passou a não ser mais recomendada. No entanto, ainda é usada para particionamento de banco de dados e somas de verificação de computação para validar transferências de arquivos.

SHA-1

SHA significa Secure Hash Algorithm (ou Algoritmo de Hash Seguro, em português). A primeira versão do algoritmo foi a SHA-1, seguida mais tarde pela SHA-2 (veja abaixo).

Enquanto o MD5 produz um hash de 128 bits, o SHA-1 gera um hash de 160 bits (20 bytes). Em um formato hexadecimal, isso seria um valor inteiro de 40 algarismos. Como o MD5, ele foi projetado para criptografia de aplicações, mas também foram encontradas vulnerabilidades. Hoje, é considerado tão pouco resistente a ataques quanto o MD5.

SHA-2

A segunda versão do SHA, chamada de SHA2, tem muitas variações. Provavelmente, uma das mais comuns é a SHA-256, cujo uso é recomendado pelo National Institute of Standards and Technology (NIST) no lugar do MD5 ou do SHA-1.

O algoritmo SHA-256 retorna um valor hash de 256 bits, ou 64 algarismos hexadecimais. Mesmo que ainda não seja perfeito, pesquisas recentes indicam que ele é consideravelmente mais seguro do que o MD5 ou o SHA-1.

Em termos de desempenho, o SHA-256 é entre 20 a 30% mais lento de calcular do que o MD5 ou o SHA-1.

SHA-3

Esse método hash foi desenvolvido no final de 2015 e ainda não foi visto em amplo uso. Seu algoritmo não se relaciona com seu predecessor, o SHA-2.

O algoritmo SHA3-256 é uma variante com aplicabilidade equivalente à do SHA-256 anterior, demorando um pouco mais para calcular do o SHA-2.

Usando valores hash para validação

O uso típico de uma função hash é fazer verificações de validação. Um uso frequente é a validação de coleções de arquivos comprimidos, como arquivos do tipo .zip ou .tar.

Dado o arquivo e o seu valor de hash esperado (comumente referido como uma soma de verificação - ou checksum, em inglês), você pode realizar seu próprio cálculo de hash para validar se o arquivo que recebeu está completo ou corrompido.

Por exemplo, eu posso gerar uma soma de verificação de MD5 para um arquivo .tar a partir de um sistema Unix usando os seguintes comandos:

tar cf - files | tee tarfile.tar | md5sum -

Para conseguir o hash MD5 para um arquivo no Windows, use o comando Get-FileHash no PowerShell.

Get-FileHash tarfile.tar -Algorithm MD5

A soma de verificação gerada pode ser exibida no local de download, próximo ao link de download. Para o receptor, uma vez que ele faz o download do arquivo, ele também pode fazer a validação de que está tudo correto executando o seguinte comando:

echo '2e87284d245c2aae1c74fa4c50a74c77 tarfile.tar' | md5sum -c

onde 2e87284d245c2aae1c74fa4c50a74c77 é o valor postado da soma de verificação. Uma execução com sucesso do comando acima gerará um status de "OK" como esse:

echo '2e87284d245c2aae1c74fa4c50a74c77 tarfile.tar' | md5sum -ctarfile.tar: OK