Ferramentas para desenvolvedores · SHA calculadora de hash
SHA-256 Passo a Passo: Preenchimento, Programação de Mensagens e Rodadas 64
· Como funciona
sha-256 criptografia APIs do navegador javascript
SHA-256 preenche sua entrada, divide-a em blocos de 512 bits e executa cada um deles através de 64 rodadas de mixagem. Esta postagem explica cada etapa em linguagem simples, sem exigir experiência em criptografia.
O que realmente acontece com seus bytes – a caixa preta que a maioria dos desenvolvedores nunca abre
SHA-256 é um algoritmo determinístico que transforma qualquer entrada em uma impressão digital de 256 bits (32 bytes). O que parece uma caixa preta vista de fora é na verdade uma sequência de etapas bem definidas. Compreender essas etapas elimina o mistério e permite verificar a correção, rastrear bugs e entender por que a saída é o que é. Cada parte do algoritmo é pública; a força vem do design, não do sigilo.
O algoritmo opera em blocos de 512 bits. Se sua entrada for mais curta, ela será preenchida. Se for mais longo, ele será dividido em vários blocos, cada um processado em sequência, com a saída de cada bloco alimentando o próximo. Depois que todos os blocos forem processados, você terá oito números de 32 bits que, concatenados, formam o resumo final de 256 bits.
Preenchimento — anexando um 1 bit, zeros e o comprimento da mensagem de 64 bits para atingir um múltiplo de 512 bits
A etapa de preenchimento é determinística e formalizada. Após sua entrada real, anexe um único 1 bit (na prática, o byte 0x80 se sua entrada terminar em um limite de byte). Em seguida, anexe zero bits até que 64 bits esteja aquém de um múltiplo de 512 bits. Por fim, anexe uma codificação big endian de 64 bits do comprimento de entrada em bits. Esse preenchimento garante que cada mensagem seja um múltiplo de 512 bits e codifica o comprimento original para que entradas idênticas de comprimentos diferentes não possam produzir o mesmo resumo.
Para a entrada abc (3 bytes = 24 bits), a mensagem preenchida é 512 bits (um bloco): os três bytes 61 62 63, seguido por 0x80, seguido por zeros, seguido pela codificação 64-bit de 24 (que é 0x00...0x18 em um campo big endian de 64 bits). A mensagem agora preenche exatamente um bloco de 512 bits. Para uma string vazia, o preenchimento acrescenta 0x80, seguido de zeros, seguido de 0x00...0x00 (indicando 0 bits de entrada). Para uma entrada mais longa, como um arquivo de 100 bytes, o preenchimento preencheria o último bloco até 512 bits e indicaria 800 bits de comprimento original.
Os valores iniciais e constantes são fixados pelo algoritmo; sua derivação histórica está fora da evidência do repositório
O algoritmo começa com oito variáveis de trabalho de 32 bits, inicializadas na primeira 32 bits das partes fracionárias das raízes quadradas dos primeiros oito números primos. Estas são constantes codificadas, visíveis em qualquer implementação de referência e no código-fonte de bibliotecas criptográficas. Eles existem porque o uso de constantes fixas da matemática evita a suspeita de um backdoor oculto. A ferramenta ToolAcre utiliza a implementação Web Crypto do navegador, que aplica essas mesmas constantes.
O algoritmo também usa constantes redondas 64, derivadas das primeiras 32 bits das partes fracionárias das raízes cúbicas dos primeiros números primos 64. Estes também são fixos e públicos. As constantes servem como material de mistura adicional; alterá-los quebraria o algoritmo e produziria resumos diferentes.
A programação de mensagens — expandindo 16 palavras em 64 com mudanças e rotações
A programação de mensagens expande 16 palavras (512 bits) em 64 palavras (2048 bits) por meio de uma fórmula específica. Para rodadas 0-15, as palavras vêm diretamente do bloco de entrada. Para rodadas 16-63, cada nova palavra é calculada pegando duas palavras anteriores (em deslocamentos específicos), aplicando uma rotação e deslocamento, fazendo XOR em outra palavra e armazenando o resultado. A fórmula é determinística e reversível no contexto de um bloco, mas a expansão espalha a influência da entrada por todas as rodadas 64.
A fórmula de expansão usa rotação para a direita (um deslocamento circular de bits em que os bits que caem em uma extremidade reaparecem na outra) e operações de deslocamento para a direita. A rotação preserva todos os bits, mas altera suas posições; shift para a direita descarta bits. A combinação de rotações, turnos e operações XOR garante que cada bit da entrada influencie múltiplas palavras na programação.
Uma rodada — as funções Ch, Maj e Sigma descritas como operações de mistura de bits e como oito variáveis de trabalho são atualizadas
Cada uma das rodadas 64 processa uma palavra do agendamento da mensagem e atualiza as oito variáveis de trabalho. A função principal envolve seis operações: uma mistura condicional (muitas vezes chamada de Ch, para "escolher") que seleciona bits com base em uma variável de controle, uma função majoritária (Maj) que escolhe o valor mais comum entre três variáveis, duas funções especiais de mistura (Sigma_0 e Sigma_1) que giram e deslocam as variáveis de trabalho, e módulo de adição 2^32. Toda aritmética é feita em palavras de 32 bits, então o overflow é resolvido.
A função "escolher" recebe três entradas de 32 bits e, para cada posição de bit, seleciona o bit da primeira entrada se um bit de controle for 1, ou o bit da segunda entrada se o bit de controle for 0. A função majoritária analisa três entradas e, para cada posição de bit, gera o valor do bit que aparece com mais frequência entre as três. Estas são operações não lineares que quebram a linearidade e garantem que pequenas alterações de entrada se propaguem de forma imprevisível através do estado.
Encadeando blocos e produzindo a saída — adicionando o resultado de cada bloco ao estado de execução
Cada rodada atualiza todas as oito variáveis de trabalho girando-as e incorporando um novo valor calculado a partir da constante da rodada atual, da palavra de agendamento da mensagem e do estado anterior. As primeiras sete variáveis de trabalho mudam: a 8ª torna-se a 1ª, a 1ª torna-se a 2ª e assim por diante. O novo 8º é calculado a partir das variáveis antigas usando as funções de mistura. Após 64 rodadas, você terá oito novos valores de 32 bits. Estes são adicionados (módulo 2^32) às constantes iniciais, produzindo o estado hash final para este bloco.
Para uma mensagem multibloco, os oito valores de um bloco tornam-se o estado inicial do próximo bloco. A cadeia garante que uma alteração em qualquer lugar da entrada afete todos os blocos subsequentes. No momento em que você chega ao bloco final, cada bit da entrada influenciou a saída final.
Exemplo resolvido e o que isso não cobre - rastreamento do preenchimento e contagem de blocos para uma mensagem curta; as provas de segurança estão fora do escopo
Para a entrada abc, a mensagem cabe em um bloco 512 bits após o preenchimento. O preenchimento adiciona 424 bits, totalizando 512 bits. A programação de mensagens expande isso para 64 palavras. Cada rodada consome uma palavra e atualiza as oito variáveis de trabalho por meio das funções de mixagem. Após as rodadas de 64, o estado é submetido a um XOR com as constantes iniciais, produzindo o resumo final ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad.
Este é um vetor de teste publicado: o mesmo cálculo na mesma entrada sempre produz a mesma saída. A ferramenta ToolAcre executa esse cálculo exato por meio da implementação do Web Crypto do navegador. Você pode verificar isso fazendo hash abc e comparando o resultado com o vetor conhecido. Qualquer navegador que implemente o Web Crypto corretamente produzirá a mesma saída; o algoritmo não admite atalhos ou caminhos alternativos.
Conclusão: Web Crypto realiza mixagem determinística SHA-256 sem expor um segredo
O algoritmo é público e cada etapa é determinística. As funções de mixagem (Ch, Maj, Sigma_0, Sigma_1) foram escolhidas para serem não lineares, o que significa que a alteração de um bit de entrada não altera previsivelmente um bit de saída. A expansão das palavras da mensagem 16 para 64 garante que toda a entrada influencie todo o cálculo. As rodadas 64 e o encadeamento de estado significam que a saída é sensível a cada bit da entrada, e o repositório usa a saída resultante como um resumo determinístico. A resistência à colisão é uma propriedade de segurança com limites, e não uma promessa de que saídas duplicadas sejam matematicamente impossíveis.
As provas criptográficas estão além do escopo desta postagem. O ponto principal é que agora você sabe o que o algoritmo realmente faz. Não é mágica e não é uma caixa preta. Se você quiser verificar se ToolAcre está fazendo hash corretamente, rastreie sua própria entrada por meio destas etapas ou use uma implementação de referência em outro idioma e compare os resultados. A implementação do navegador e qualquer referência correta produzirão resumos idênticos para entradas idênticas.