O que esta ferramenta faz
Calcula o hash SHA-1 de qualquer texto ou ficheiro no teu navegador, devolvendo um digest hexadecimal de 40 caracteres. O SHA-1 é uma função de hash de 160 bits publicada pelo NIST em 1995 (FIPS 180-1), desenhada pela NSA. Está descontinuada para fins de segurança: um ataque de colisão prático ("SHAttered") foi demonstrado pela Google e pelo CWI Amsterdam em 2017, e colisões com prefixo escolhido seguiram em 2019. O SHA-1 já não é considerado criptograficamente seguro.
Onde o SHA-1 ainda anda por aí
- IDs de objetos do git. Cada commit, tree e blob do git é identificado pelo seu hash SHA-1. O modelo de objetos do git está a migrar para SHA-256 (a flag
--object-format=sha256existe), mas o SHA-1 continua a ser o defeito na esmagadora maioria dos repositórios. O risco de colisão para IDs de commit é real mas gerido: o GitHub e outros forges usam deteção tipo SHAttered (a bibliotecasha1dc) para sinalizar colisões preparadas. - Subversion (SVN). Mesmo raciocínio que o git, com menos esforço de migração em curso.
- Certificados TLS antigos. Os navegadores deixaram de confiar em certificados assinados com SHA-1 em 2017, mas sistemas legados ainda os produzem.
- Código existente que faz hash por motivos não relacionados com segurança. Chaves de cache, fingerprints, tabelas de deduplicação — tudo bem.
Quando o SHA-1 é inadequado
- Novos certificados TLS, certificados de assinatura de código ou assinaturas de documentos. Usa SHA-256 ou SHA-384.
- Armazenamento de palavras-passe. Usa um hash lento e com salt como bcrypt ou Argon2. O SHA-1 é demasiado rápido e não foi desenhado para isto.
- Qualquer coisa em que um atacante possa escolher o input. Um atacante determinado com um cluster alugado pode produzir uma colisão SHA-1 em dias. Se o teu modelo de segurança permite ao atacante influenciar o que é hasheado, o SHA-1 está partido.
- Subresource Integrity (SRI). Os navegadores aceitam SHA-1 em atributos
integrity, mas a especificação recomenda SHA-256 no mínimo.
Vetores de teste
Do FIPS 180-2 e da suite de referência do SHA-1:
- String vazia
""→da39a3ee5e6b4b0d3255bfef95601890afd80709 "abc"→a9993e364706816aba3e25717850c26c9cd0d89d"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"→84983e441c3bd26ebaae4aa1f95129e5e54670f1"The quick brown fox jumps over the lazy dog"→2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Notas
Porquê 40 caracteres? O SHA-1 produz 160 bits = 20 bytes. 20 bytes × 2 caracteres hex por byte = 40 caracteres visíveis.
Porque é que o git usa SHA-1 se está partido? O git usa SHA-1 como identificador endereçado por conteúdo, não como primitiva de segurança. O modelo de ameaça é "dois objetos bem formados colidem por acaso", o que continua a ser astronomicamente improvável. O modelo de ameaça não é "um atacante envia um commit malicioso com o mesmo hash que o teu commit real" — para isso, o GitHub e outros usam sha1dc para detetar preparações tipo SHAttered e rejeitá-las. A migração para SHA-256 está a acontecer mas lentamente porque a base instalada é enorme.
Porque é que o meu SHA-1 difere do que o sha1sum devolve? Newline final. echo "hello" | sha1sum inclui o \n. Colar "hello" aqui não. Usa echo -n ou o seletor de ficheiros.
Ferramentas relacionadas
- Gerador de hashes — cinco hashes lado a lado
- SHA-256 — o substituto moderno do SHA-1
- MD5 — o predecessor; ainda mais profundamente partido