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
- É reversível? Você consegue recuperar a entrada original a partir da saída?
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.