Função hash
Uma função hash transforma dados de praticamente qualquer tamanho em um resumo de tamanho fixo.
Definição
Uma função hash recebe dados e calcula um valor de tamanho fixo chamado hash, resumo ou impressão digital. Os mesmos bytes de entrada sempre produzem a mesma saída, enquanto até uma pequena mudança na entrada normalmente altera o resumo.
Hashing não é criptografia reversível. Um resumo não deve ser decodificado ou descriptografado para recuperar a mensagem original; ele é usado para comparação, identificação, verificação de integridade e como componente de construções criptográficas maiores.
Propriedades criptográficas
Uma função hash criptográfica é projetada para resistir a ataques de pré-imagem, segunda pré-imagem e colisão. Em termos simples, deve ser difícil encontrar uma entrada para um resumo dado, encontrar outra entrada com o mesmo resumo de uma mensagem escolhida ou encontrar quaisquer duas entradas com o mesmo resumo.
SHA-256, SHA-512, SHA-3 e BLAKE2 são usados em sistemas modernos. MD5 e SHA-1 ainda aparecem em somas de verificação legadas, mas sua resistência a colisões está quebrada e eles não devem proteger dados sensíveis.
Usos e confusões comuns
Hashes costumam ser exibidos como strings hexadecimais. Por exemplo, SHA-256 produz 32 bytes, normalmente escritos como 64 caracteres hexadecimais. Comparar um resumo recém-calculado com um valor publicado e confiável pode mostrar se os dados mudaram.
Um hash simples não autentica quem criou os dados. Use HMAC ou assinatura digital quando um atacante puder modificar conteúdo deliberadamente, e use uma função de hash de senha como Argon2id ou bcrypt em vez de um hash rápido bruto para armazenar senhas.
Não. Um hash é um resumo unidirecional, não texto cifrado. Só é possível tentar entradas possíveis, calcular seus hashes e comparar os resultados.
Elas se sobrepõem em alguns usos, mas não em segurança. Uma soma de verificação detecta mudanças acidentais; um hash criptográfico é projetado para resistir a certos ataques deliberados.
Elas podem usar algoritmos diferentes ou aplicar hash a bytes diferentes. Espaços, quebras de linha, normalização Unicode, codificação de texto e entrada como arquivo ou texto afetam o resultado.