TK TaskKit
Ferramentas para programadores

Gerador de hashes SHA-1

Calcula hashes SHA-1 de 160 bits para texto ou ficheiros no teu navegador. Usado pelo git para IDs de commit e em certificados antigos. Considerado obsoleto a nível de segurança; o SHA-256 é o substituto moderno.

Entrada
Hashes
Cola texto para calcular MD5, SHA-1, SHA-256, SHA-384 e SHA-512.

As entradas ficam neste dispositivo. Cada ferramenta para programadores no TaskKit corre inteiramente no teu navegador. Tokens, payloads e texto colado não são transmitidos para servidores do TaskKit nem para terceiros.

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=sha256 existe), 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 biblioteca sha1dc) 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