Idealmente, uma função hash praticamente não retorna colisões; isto é, não há duas entradas diferentes gerando o mesmo valor de hash. Isso é particularmente importante para funções hash criptográficas: uma colisão de hash é considerada uma vulnerabilidade.

Finalmente, uma função de hash deve gerar valores de hash imprevisivelmente diferentes para qualquer valor de entrada. Por exemplo, tome as seguintes duas frases muito semelhantes:

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

Podemos comparar o Valores de hash MD5 gerados de cada uma das duas frases:

1. 2e87284d245c2aae1c74fa4c50a74c772. c17b6e9b160cda0cf583e89ec7b7fc22

Dois hashes muito diferentes foram gerados para duas frases semelhantes, que é uma propriedade útil tanto para validação quanto para criptografia. Este é um corolário de distribuição: os valores de hash de todas as entradas devem ser distribuídos de maneira uniforme e imprevisível em toda a faixa de possíveis valores de hash.

Existem várias funções de hash que são amplamente usadas. Todos foram projetados por matemáticos e cientistas da computação. Ao longo de pesquisas adicionais, algumas foram mostradas como fracas, embora todas sejam consideradas boas o suficiente para aplicações não criptográficas.

MD5

A função de hash MD5 produz um valor de hash de 128 bits. Ele foi projetado para uso em criptografia, mas as vulnerabilidades foram descobertas ao longo do tempo, portanto, não é mais recomendado para esse fim. No entanto, ele ainda é usado 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. A primeira versão do algoritmo é SHA-1 e foi posteriormente seguida por SHA-2 (veja abaixo).

Enquanto o MD5 produz um hash de 128 bits, o SHA1 gera um hash de 160 bits (20 bytes). No formato hexadecimal, é um número inteiro com 40 dígitos. Como o MD5, ele foi projetado para aplicativos de criptografia, mas logo também foi encontrado também com vulnerabilidades. Atualmente, não é mais considerado menos resistente a ataques do que o MD5.

SHA-2

A segunda versão do SHA, chamada SHA-2, tem muitas variantes. Provavelmente o mais usado é o SHA-256, recomendado pelo Instituto Nacional de Padrões e Tecnologia (NIST), em vez de MD5 ou SHA-1. O algoritmo SHA-256 retorna um valor de hash de 256 bits ou 64 dígitos hexadecimais. Embora não seja perfeita, as pesquisas atuais indicam que é consideravelmente mais seguro que o MD5 ou o SHA-1. Em termos de desempenho, um hash SHA-256 é cerca de 20 a 30% mais lento para calcular do que os hashes MD5 ou SHA-1.

SHA-3

Esse método de hash foi desenvolvido no final de 2015 e ainda não foi amplamente utilizado. Seu algoritmo não tem relação com o utilizado por seu antecessor, SHA-2. O algoritmo SHA3-256 é uma variante com aplicabilidade equivalente à do SHA-256 anterior, com o primeiro demorando um pouco mais para calcular do que o posterior.

Um uso típico de funções de hash é executar verificações de validação. Um uso frequente é a validação de coleções compactadas de arquivos, como arquivos .zip ou .tar. Dado um arquivo e seu valor esperado de hash (geralmente chamado de soma de verificação), você pode executar seu próprio cálculo de hash para validar se o arquivo morto recebido está completo e não está corrompido.

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

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

Para obter o hash MD5 de um arquivo no Windows, use o Get-FileHash Comando do PowerShell:

Get-FileHash tarfile.tar -Algorithm MD5

A soma de verificação gerada pode ser postada no site de download, ao lado do link de download do arquivo. O destinatário, depois de baixar o arquivo, pode validar se ele foi encontrado corretamente, executando o seguinte comando:

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

Onde 2e87284d245c2aae1c74fa4c50a74c77 é a soma de verificação gerada lançada. A execução bem-sucedida do comando acima irá gerar um status OK como este:

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