Representar um hash é diferente de recodificar seu texto

Um resultado SHA-256 tem 256 bits, ou 32 bytes. Base16 do RFC 4648 representa cada byte com dois dígitos hexadecimais, totalizando 64 caracteres. Base64 padrão com preenchimento representa os mesmos 32 bytes com 44 caracteres. Codificar a string hexadecimal de 64 caracteres como texto UTF-8 usa 64 bytes de entrada e gera 88 caracteres Base64. Esse resultado codifica o texto que exibe o hash, não seus bytes originais.

Bytes originais do hash: 32 bytes para 44 caracteres Base64; texto HEX: 64 bytes para 88 caracteres
Diagrama original do fluxo de bytes. A são os bytes originais do hash; B é o texto HEX de 64 caracteres. As contagens Base64 de 44 e 88 incluem preenchimento.

RFC 6234: SHA-256 digest size

RFC 4648 §4, §8: Base64 / Base16

Confira a entrada antes de usar as ferramentas

Calculamos SHA-256 de abc e reproduzimos os dois caminhos em código. A ferramenta de hash do Moyoutil fornece texto hexadecimal. Colar esse valor na ferramenta Base64 codifica os bytes UTF-8 do texto e gera 88 caracteres. Essa ferramenta não interpreta HEX como bytes originais do hash. O exemplo Web Crypto separado distingue bytes de texto HEX e mostra os comprimentos dos dois caminhos.

const raw = new Uint8Array(await crypto.subtle.digest(
  'SHA-256', new TextEncoder().encode('abc')));
const hex = Array.from(raw,
  n => n.toString(16).padStart(2, '0')).join('');
const rawBase64 = btoa(String.fromCharCode(...raw));
const textBase64 = btoa(hex); // ASCII HEX text
console.log(raw.length, hex.length,
            rawBase64.length, textBase64.length);
// 32 64 44 88

Confira a documentação do sistema receptor para a representação exigida. Base64 ou Base64url, preenchimento e os dados codificados são condições separadas. Ter o mesmo comprimento não confirma o mesmo checksum. Este artigo explica a conversão de representação; não verifica assinaturas nem determina se um arquivo é seguro.

Perguntas frequentes

Converter para Base64 calcula o hash novamente?

Não. Codificar os bytes originais do hash muda sua representação. Codificar texto HEX usa dados de entrada diferentes. Separe ambas as operações do recálculo de SHA-256 dos dados originais.