Português (Brasil)

Ferramentas para desenvolvedores · SHA calculadora de hash

Hex, Base64 e bytes brutos: três maneiras de escrever o mesmo resumo SHA

· Como funciona

sha-256 base64 codificação formatos de arquivo

Um resumo de 32 bytes mostrado como 64 caracteres hexadecimais, 44 caracteres base64 com preenchimento, base64url e bytes brutos com limites de bytes marcados
Ilustração vetorial original ToolAcre

sha256sum imprime hexadecimal, package-lock.json armazena base64 e Docker usa um prefixo sha256:. Eles podem ser todos iguais 32 bytes. Este post explica cada representação e como converter entre elas.

Os hashes que parecem diferentes, mas concordam – uma string de arquivo de bloqueio e uma soma de verificação de terminal para o mesmo arquivo

Um resumo SHA-256 é fundamentalmente 32 bytes. A maneira como você escreve esses bytes determina a aparência do resumo. Um resumo, 32 bytes idênticos, aparece como 64 caracteres hexadecimais (dois por byte) ou 44 caracteres base64 (aproximadamente quatro por três bytes) ou comprimentos e formatos diferentes dependendo da codificação. A confusão surge porque um arquivo de bloqueio pode mostrar uma representação e um terminal mostra outra, ambos para o mesmo 32 bytes subjacente.

Compreender a codificação é a etapa que transforma "por que eles parecem diferentes?" em "Posso confirmar que são iguais." Todas as três representações são equivalentes quando você as decodifica de volta em bytes.

Um resumo são bytes - 20, 32, 48 ou 64 deles dependendo do algoritmo, antes de qualquer codificação de texto

Antes de existir qualquer representação textual, o resultado é um ArrayBuffer de bytes de resumo. ToolAcre envolve esse buffer com Uint8Array e, em seguida, grava cada byte como dois dígitos hexadecimais ou converte cada byte em um caractere binário antes de chamar btoa. Nenhum dos formatadores executa novamente o hash e nenhum altera um único bit de resumo.

A largura em bytes segue o algoritmo selecionado nesta ferramenta: SHA-1 retorna vinte bytes, SHA-256 trinta e dois, SHA-384 quarenta e oito e SHA-512 sessenta e quatro. Essas são saídas suportadas verificadas pelos metadados e testes do algoritmo. Bytes brutos são apropriados para comparação programática; hex e base64 são notações de transporte para canais que esperam texto.

Hex — dois caracteres por byte, por que domina as ferramentas de linha de comando e a questão do caso

A representação hexadecimal usa os dígitos 0-9 e as letras AF (ou a-f) para representar os valores possíveis de 16 de um nibble de 4 bits. Dois dígitos hexadecimais representam um byte. O resumo SHA-256 do abc de entrada é 32 bytes, portanto, é exibido como 64 caracteres hexadecimais: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Este é o formato que a maioria das ferramentas de linha de comando imprime. Hexadecimal é legível e inequívoco; cada byte é representado exatamente pelos mesmos dois caracteres todas as vezes.

Hexadecimal é o formato padrão para somas de verificação e hashes na documentação e na linha de comando. É fácil de ler e copiar e não há preenchimento, nem distinção entre maiúsculas e minúsculas na interpretação (embora a convenção determine letras minúsculas ou maiúsculas de forma consistente) e nenhum caractere especial que precise de escape em URLs ou JSON. A desvantagem é que são necessários o dobro de caracteres que bytes brutos, e é por isso que existem outros formatos.

Base64 e base64url — aproximadamente quatro caracteres por três bytes, preenchimento e onde cada um aparece (impressões digitais SRI, npm, SSH)

Base64 codifica três bytes como quatro caracteres extraídos de um alfabeto de 64 caracteres: A-Z, a-z, 0-9, +, /. Os três bytes 61 62 63 (o ASCII códigos para abc) codificados como YWJj em base64. Um resumo completo de 32 bytes SHA-256 é codificado como aproximadamente 44 caracteres base64. O preenchimento com caracteres = traz o comprimento de saída para um múltiplo de 4, portanto, 44 caracteres mais preenchimento 0 (porque 32 é um múltiplo de 3, nenhum preenchimento é necessário). A decodificação inverte o processo: quatro caracteres base64 são decodificados em três bytes.

Base64 aparece em arquivos package-lock.json, npm Shrinkwrap, atributos SRI (Integridade de sub-recursos) em HTML e impressões digitais de chave SSH. É compacto - aproximadamente 33% mais longo que bytes brutos, em comparação com 100% mais longo do hexadecimal. A desvantagem é que nem todas as representações de texto são igualmente fáceis de ler; base64 parece mais embaralhado ao olho humano do que hexadecimal.

Formulários prefixados - sha256: em resumos de contêiner, sha384- em atributos de integridade, SHA256: em SSH

Base64url é uma variante definida em RFC 4648 que substitui - e _ por + e /. O alfabeto se torna A-Z, a-z, 0-9, -, _. JWTs usam base64url porque + e / têm significados especiais em URLs (+ pode ser lido como um espaço em strings de consulta, / é um separador de caminho). Um segmento JWT é sempre codificado em base64url e um decodificador que insiste no padrão base64 irá rejeitá-lo. Por outro lado, um decodificador base64url que não aceita o alfabeto padrão falhará no base64 padrão.

O preenchimento é opcional em base64url. Pads base64 padrão com = para garantir que o comprimento da saída seja um múltiplo de 4. Base64url geralmente omite o preenchimento porque = é em si URL-inábil. Um decodificador deve aceitar base64url com ou sem preenchimento, e o codificador deve ser explícito sobre o que produz. A ferramenta ToolAcre base64 aceita ambos os alfabetos e tolera a falta de preenchimento na entrada e permite escolher o formato na saída.

Exemplo resolvido - um resumo convertido de hexadecimal para base64 e vice-versa, com os limites de bytes marcados

Os formulários prefixados adicionam um identificador de esquema ao resumo. Os resumos de imagem do Docker usam sha256:ba7816bf..., onde sha256: é o prefixo. As impressões digitais SSH usam SHA256:, com dois pontos. Algumas ferramentas usam sha256= ou SHA256= (com sinal de igual). O prefixo é puramente informativo; informa qual algoritmo produziu o resumo. A remoção do prefixo deixa os mesmos bytes na mesma codificação.

Ao comparar resumos, o prefixo é ruído. Se uma ferramenta imprimir SHA256:ba78... e outra imprimir ba78..., elas serão o mesmo resumo; o prefixo são apenas metadados sobre o formato. Da mesma forma, prefixos como sha256:- (usados ​​em alguns contextos de contêiner) ou sha384- (usados ​​em atributos de integridade) são convenções de formatação que não alteram os bytes. Retire-os para comparação.

O que isso não cobre — qual codificação uma determinada ferramenta emite; verifique o formato de saída antes de comparar

Um resumo, o SHA-256 da entrada abc, aparece em vários formatos: hexadecimal (64 caracteres), base64 com preenchimento (44 caracteres), base64url com preenchimento (44 caracteres, com - e _ em vez de + e /), ou com vários prefixos. Para confirmar que são iguais, decodifique cada um de volta para bytes e compare os bytes. A representação hexadecimal ba7816bf... decodifica para os bytes 0xba 0x78 0x16 0xbf 0x8f 0x01 0xcf 0xea ... A representação base64 converte para a mesma sequência de bytes quando decodificada.

A calculadora hash ToolAcre SHA tem saída em hexadecimal por padrão. Se precisar de base64, você pode usar uma ferramenta separada para converter hexadecimal em base64 ou usar o utilitário base64 no mesmo site para codificar o texto diretamente. Ferramentas projetadas para contextos específicos (npm para package-lock.json, Docker para resumos de imagens) geram saída no formato esperado pelo contexto. Entender que são todos iguais 32 bytes em roupas diferentes elimina a confusão quando as ferramentas discordam quanto ao formato.

Conclusão: compare bytes, não strings - calcule o resumo com a calculadora de hash ToolAcre SHA e, em seguida, converta para a representação que você está verificando

Para converter manualmente um resumo hexadecimal em base64, agrupe os dígitos hexadecimais em bytes, converta cada byte em decimal e codifique usando o alfabeto base64. O byte 0xba (hex ba) é decimal 186; 0x78 é 120; 0x16 é 22; 0xbf é 191. Agrupando esses quatro bytes e codificando como base64 fornece os caracteres w (0 + 22 no alfabeto), como (codificação 186), AA (codificação 120), vw (codificação 191). O resumo completo requer fazer isso 10 vezes e preencher, se necessário. Este processo manual é instrutivo, mas tedioso; uma ferramenta de conversão base64 torna isso instantâneo.

O principal insight é que um resumo contém os bytes primeiro e a representação do texto é secundária. Cada codificação dos mesmos bytes é decodificada de volta para os mesmos bytes e, portanto, é intercambiável para fins de verificação de integridade. Diferenças de maiúsculas e minúsculas em hexadecimal, diferenças de preenchimento em base64, prefixos e espaçamento são opções de formatação que não afetam o valor real. Quando você domina a capacidade de converter entre representações, as incompatibilidades de formato de resumo tornam-se problemas de depuração que você pode resolver em vez de mistérios.