SHA-256 é um procedimento definido com precisão que calcula uma impressão dos dados, chamada hash. A mesma entrada produz sempre o mesmo resultado de 256 bits: 32 bytes, normalmente escritos como 64 caracteres hexadecimais. O Bitcoin usa-o para ligar e verificar dados e na mineração. A impressão não é uma cópia cifrada do conteúdo original.
Imagine que alguém lhe envia um ficheiro e o respetivo hash. Ao fazer o cálculo, pode verificar se os dados descarregados correspondem àquela impressão. Mesmo uma pequena alteração na entrada muda, com probabilidade muito elevada, o resultado no seu conjunto. Mas a impressão não diz, por si só, quem criou o ficheiro nem se ele é seguro. Se um atacante fornecer um ficheiro malicioso e o seu hash, ambos corresponderão. A confiança na fonte do valor de referência também importa. [1] [5]
Para os três bytes ASCII abc, sem aspas nem mudança de linha, o resultado é ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Não é um número gerado ao acaso: qualquer implementação correta obtém esse resultado a partir desses mesmos bytes. Acrescentar um espaço ou uma mudança de linha altera a entrada. Um hash diferente não significa então que o algoritmo falhou. A codificação do texto também conta. [3]
A cifragem permite recuperar uma mensagem com uma chave. SHA-256 não tem essa chave nem um procedimento inverso. Isso não impede testar entradas prováveis: quem suspeitar que calculou o hash de um PIN de quatro dígitos pode experimentar as 10 000 combinações e comparar os resultados. Um hash longo não dá a um segredo fraco a entropia (o grau de imprevisibilidade da entrada) que lhe falta. A segurança depende também de quantas possibilidades o atacante precisa realmente de testar. [5] [7]
Os identificadores de blocos, txid (identificadores de transações) e a combinação de pares de hashes num Merkle Tree (uma árvore de hashes ligados entre si) usam SHA256(SHA256(data)). A segunda passagem processa os 32 bytes brutos do primeiro resultado, não a sua representação textual de 64 caracteres. A saída continua a ter 256 bits. O hash duplo é aqui uma regra do protocolo, não uma prova de que SHA-256 simples esteja comprometido. O Bitcoin usa ainda outras construções: o Taproot, por exemplo, acrescenta etiquetas predefinidas à entrada para separar diferentes finalidades do hash. [2] [4] [6]
Um mineiro altera repetidamente os campos permitidos de um cabeçalho de bloco candidato e calcula o seu SHA-256 duplo. Procura um resultado que, interpretado como número, não exceda o target (limite numérico) definido. Não está a decifrar uma mensagem nem a procurar a chave privada de alguém. Encontrar um cabeçalho adequado exige muitas tentativas; verificá-lo é rápido. O cabeçalho também aponta para o bloco anterior, pelo que alterar um bloco antigo quebra as ligações seguintes. Um Full Node (um nó que verifica por si próprio as regras do Bitcoin) verifica ainda as transações e as restantes regras: um hash adequado não torna válido, por si só, um bloco inválido. [4]
Existem mais mensagens possíveis do que impressões de 256 bits. Algumas entradas diferentes têm, portanto, de partilhar o mesmo hash: é uma colisão. O que importa é saber se conseguimos encontrá-la deliberadamente. Num hash ideal de 256 bits, uma pesquisa genérica por qualquer colisão exige da ordem de 2^128 tentativas; encontrar uma entrada para uma impressão previamente fixada exige da ordem de 2^256. São problemas distintos. Encontrar uma colisão não revela, por si só, uma chave privada de Bitcoin. Estes números também não garantem a segurança de uma carteira ou de um protocolo completos. [5]
SHA-256 é um componente, não uma solução completa para todos os problemas de segurança. É deliberadamente rápido e, por isso, não é adequado, sozinho, para guardar palavras-passe escolhidas por pessoas: um atacante poderia testar hipóteses rapidamente. Para isso existem procedimentos específicos de derivação de palavras-passe, por exemplo com custo computacional ajustável. Da mesma forma, a receita caseira «calculo um hash e obtenho uma chave segura» não resolve a falta de aleatoriedade inicial nem a exposição da entrada. Normalmente não é preciso calcular SHA-256 à mão, mas convém perceber o que uma impressão verificada demonstra e o que não demonstra. [8] [7]
SHA-256 pertence à família SHA-2 e está descrito em NIST FIPS 180-4. Antes do cálculo, completa a entrada, incluindo informação sobre o seu comprimento, e processa-a em segmentos de 512 bits, cada um durante 64 rondas. Estes blocos internos têm 64 bytes e não são blocos de Bitcoin. Um cabeçalho de bloco de Bitcoin tem 80 bytes; o bloco completo contém também transações. O 256 do nome indica o comprimento da impressão obtida, não o tamanho de um bloco ou de uma chave privada. [1] [4]
Para ter uma visão mais completa, leia este verbete junto com Hash, Proof of Work, Block Header, Endereço Bitcoin, Merkle Tree, Bitcoin. Também há referências a este verbete em Hash, ASIC Miner, Hashrate, Nonce.