Uma impressão digital para os dados
Uma função hash pega qualquer entrada (uma palavra, um documento, um vídeo de 4 GB) e transforma em uma sequência curta, de tamanho fixo, chamada hash, resumo ou checksum. A mesma entrada sempre gera o mesmo hash, e a menor mudança gera um completamente diferente:
| Entrada | Hash SHA-256 |
hello | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
Hello | 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 |
hello! | ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b |
Uma letra maiúscula ou um ponto de exclamação mudam todos os caracteres do resultado. Teste no Gerador de hash.
O que faz uma boa função hash
- Determinística: a mesma entrada sempre gera o mesmo hash, em qualquer computador.
- De mão única: não dá para voltar do hash para a entrada.
- Resistente a colisões: deve ser praticamente impossível achar duas entradas diferentes com o mesmo hash.
- Rápida de calcular para checksums, o que é útil, e também é o motivo de hashes rápidos não servirem para senhas (veja abaixo).
Hash não é criptografia
A criptografia funciona nos dois sentidos: com a chave, você recupera o original. Um hash não tem chave e não pode ser revertido; ele só permite verificar se algo confere. Base64 é outra coisa: é só uma codificação, e qualquer pessoa pode decodificar.
Os algoritmos mais comuns
| Algoritmo | Tamanho | Situação |
| MD5 | 128 bits (32 caracteres hexadecimais) | Quebrado desde 2004; só serve para detectar danos acidentais |
| SHA-1 | 160 bits (40 caracteres hexadecimais) | Quebrado: a primeira colisão real foi publicada em 2017 |
| SHA-256 | 256 bits (64 caracteres hexadecimais) | Seguro; a escolha padrão hoje |
| SHA-512 | 512 bits (128 caracteres hexadecimais) | Seguro; muitas vezes mais rápido que o SHA-256 em computadores de 64 bits |
Veja a palavra hello em cada um:
- MD5:
5d41402abc4b2a76b9719d911017c592 - SHA-1:
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d - SHA-256:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
O que significa MD5 e SHA-1 estarem "quebrados"
Com MD5 e SHA-1, pesquisadores conseguem criar de propósito dois arquivos diferentes com o mesmo hash. Um atacante poderia usar isso para trocar um arquivo inofensivo por um malicioso com o mesmo checksum, ou para falsificar um documento assinado. Nenhum dos dois está quebrado no sentido de poder ser revertido, e um dano aleatório ainda muda o hash, então um checksum MD5 ainda detecta um download que parou no meio. O que ele não consegue é provar que ninguém adulterou o arquivo.
O SHA-256 e o SHA-512 fazem parte da família SHA-2, publicada em 2001, e não se conhece nenhum ataque prático contra eles. O SHA-3, padronizado em 2015, é um projeto diferente mantido como reserva.
Onde os hashes são usados
- Verificar downloads: os desenvolvedores publicam o SHA-256 dos arquivos; se o seu conferir, ele é idêntico. Veja como verificar um checksum.
- Assinaturas digitais e certificados HTTPS: calcula-se o hash do documento ou do certificado, e é esse hash que é assinado.
- Git: cada commit e cada arquivo é identificado pelo hash. O Git sempre usou SHA-1 e passou a oferecer suporte a SHA-256.
- Bitcoin e outras blockchains: os blocos são encadeados com SHA-256.
- Encontrar arquivos duplicados: dois arquivos com o mesmo SHA-256 são o mesmo arquivo.
Hashes e senhas
Os sites nunca deveriam guardar a sua senha, só um hash dela; quando você entra, eles calculam o hash do que você digitou e comparam. Mas o SHA-256 é a ferramenta errada aqui: ele é tão rápido que um atacante com um banco de dados vazado consegue testar bilhões de senhas por segundo. Senhas precisam de um hash lento e com salt feito para isso, como bcrypt, scrypt ou Argon2. O salt é um valor aleatório somado a cada senha antes do hash, para que duas pessoas com a mesma senha fiquem com hashes diferentes.
Teste
O Gerador de hash calcula ao mesmo tempo MD5, SHA-1, SHA-256, SHA-384 e SHA-512 de qualquer texto ou arquivo, no seu navegador, e pode comparar com um checksum publicado.