Três palavras, constantemente trocadas

"Essa senha está criptografada?" "É só fazer hash da URL." "Os dados estão codificados, então estão seguros." Essas frases estão em toda parte, e a maioria delas usa a palavra errada. Hash, criptografia e codificação são três operações distintas com três propósitos diferentes, e confundi-las leva a erros reais de segurança, como guardar senhas com um método que não protege nada.

A boa notícia é que duas perguntas simples as separam por completo.

As duas perguntas

  1. É reversível? Você consegue recuperar a entrada original a partir da saída?
  2. Precisa de uma chave? É necessário um segredo, ou qualquer um pode realizar a operação?

Posicione as três operações em relação a essas perguntas e o quadro fica claro:

  • Codificação é reversível e não precisa de chave.
  • Hash não é reversível e não precisa de chave.
  • Criptografia é reversível e precisa de chave.

Essa tabela é o artigo inteiro. O resto é detalhe.

Codificação: reversível, sem chave

A codificação reescreve dados em uma representação diferente para que possam atravessar um canal que espera um formato específico. O transforma bytes em texto seguro; a codificação de URL escapa caracteres ilegais em uma URL; o transforma caracteres em bytes. Nada disso é secreto. Qualquer um pode decodificá-lo de volta, porque a reversibilidade é todo o ponto. A codificação oferece segurança zero. Se você ouvir "o token está codificado, então está seguro", isso é um alerta vermelho: codificado significa legível.

Hash: não reversível, sem chave

Uma função de hash mapeia qualquer entrada para um resumo de tamanho fixo, e você não consegue rodá-la ao contrário para recuperar a entrada. Ela não precisa de chave, então qualquer um pode calcular o mesmo resumo a partir da mesma entrada. Isso a torna perfeita para verificação: checagens de integridade, endereçamento por conteúdo e detecção de mudança. É a ferramenta certa quando você precisa confirmar que duas coisas são iguais sem guardar a original, mas não esconde nada de forma reversível, porque não há nada a reverter.

Criptografia: reversível, com chave

A criptografia transforma dados de modo que apenas quem possui a chave certa possa transformá-los de volta. Esta é a única das três construída para sigilo. É reversível por desenho, mas só com a chave, que é exatamente a propriedade que as outras duas não têm: a codificação é reversível por qualquer um, o hash não é reversível por ninguém, a criptografia é reversível por quem tem a chave.

Como escolher a certa

O propósito decide a ferramenta. Precisa que os dados sobrevivam ao transporte como texto? Codifique-os. Precisa verificar integridade ou comparar sem guardar o original? Faça hash. Precisa manter dados secretos de qualquer um sem a chave? Criptografe-os.

O erro clássico é recorrer à coluna errada. Guardar senhas com codificação simples (reversível por qualquer um) ou mesmo criptografia simples (uma chave roubada expõe tudo) é muito mais fraco do que um hash de senha feito para esse fim, que é coberto em seu próprio artigo. A ferramenta Hash e a ferramenta Base64 deixam você observar o hash e a codificação se comportarem de forma diferente na mesma entrada, o resumo nunca se reverte, o Base64 sempre se reverte.

Esta série, em ordem

Este artigo abre a série Hashes e . Suas duas perguntas (é reversível, precisa de chave) situam o hash entre os vizinhos; as partes então constroem o hash a partir das suas garantias até a escolha da função, e acrescentam a chave que faz o HMAC, da sua construção à verificação segura e ao seu uso na assinatura de requisições de API.

  1. Hash criptográfico: SHA-256 e a família SHA-2. O que uma função de hash garante, as propriedades que a tornam criptográfica e por que um resumo não é criptografia.
  2. Por que hashes criptográficos são de mão única. Resistência à pré-imagem, e por que reverter um hash é sempre uma busca, nunca uma inversão.
  3. Colisões, resistência à pré-imagem e o limite do aniversário. As três propriedades de segurança, por que colisões importam e a aritmética do aniversário que define a força real.
  4. Como escolher um hash: MD5, SHA-1, SHA-2, SHA-3 e BLAKE. , -1, SHA-2, SHA-3 e BLAKE: quais estão quebradas, quais são seguras e como escolher.
  5. HMAC: hash com chave para autenticação de mensagens. Por que um hash simples prova integridade mas não autenticidade, e como uma chave secreta resolve isso.
  6. Por que HMAC, e não hash(chave + mensagem). O ataque de extensão de comprimento que quebra hash(chave + mensagem), e a construção aninhada que o derrota.
  7. Como verificar um HMAC com segurança: tempo constante e repetição. Por que comparar com == vaza tempo, e por que uma assinatura válida sozinha não impede uma repetição.
  8. Como autenticar requisições de API com HMAC. Como um segredo compartilhado permite a um servidor confiar numa requisição que não viu ser feita, com a proteção contra repetição no lugar.