Skip to content
Voltar ao blog
Segurança

Converter MD5 para SHA-256? Por que é impossível e o que fazer

Não é possível converter um hash MD5 para SHA-256: o hash é unidirecional. O que os conversores realmente fazem. Ferramentas online grátis.

11 min de leitura

Converter MD5 para SHA-256? Por que é impossível e o que fazer

Muitas páginas prometem fazer isso, e algumas até parecem ferramentas de verdade. A operação que elas anunciam não existe, e o motivo importa, porque ele muda o que você deve fazer em seguida.

A resposta curta: você não consegue converter MD5 em SHA-256 (nem SHA-256 em MD5)

Você não pode converter um hash MD5 para SHA-256. Um digest MD5 são 128 bits de saída que não contêm a entrada que os produziu. O SHA-256 precisa dessa entrada para calcular qualquer coisa. Sem os dados originais falta o passo do meio, e nenhuma ferramenta ou biblioteca preenche essa lacuna.

Veja a mesma entrada sob três algoritmos:

AlgoritmoDigest de helloCaracteres hexBits
MD55d41402abc4b2a76b9719d911017c59232128
SHA-1aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d40160
SHA-2562cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b982464256

Olhe os três digests como strings. Eles não compartilham prefixo nem nenhum trecho, e não existe conta que leve de um ao outro. A única coisa que os liga é a palavra hello, e nenhum deles a carrega. Calcule você mesmo com o gerador de hash MD5 e o gerador de SHA-256 se quiser ver os dois mudarem de forma independente enquanto você digita.

A direção também não faz diferença. Ir de SHA-256 para MD5 falha pelo mesmo motivo: as duas funções destroem informação de propósito, então nenhum dos digests pode ser desfeito até chegar à entrada de que o outro precisaria.

Resta a pergunta útil. Ninguém digita essa busca por curiosidade sobre teoria de hash, então o que você estava realmente tentando fazer? Na prática é uma de quatro tarefas, e cada uma tem uma resposta que funciona:

  1. Verificar um download ou comparar checksums
  2. Migrar um banco de senhas para fora do MD5
  3. Recuperar a entrada original por trás de um hash
  4. Obter os mesmos dados com hash de outro algoritmo

Antes de chegar a elas, vale olhar por dentro das páginas que prometem a conversão. Quem reconhece o padrão não confia na saída de nenhuma.

O que uma página de “conversor de MD5 para SHA-256” realmente faz

Só existem três possibilidades, e nenhuma delas é uma conversão.

A maioria delas pede o texto original. Você cola uma string, a página produz os dois digests e o texto de marketing chama isso de conversão. É um gerador de hash com um rótulo enganoso. Nada foi convertido; a entrada foi hasheada duas vezes.

Algumas consultam o digest em uma tabela de pares entrada-digest, montada a partir de wordlists e de vazamentos de credenciais. Cole um MD5 cuja entrada esteja nessa tabela e a página encontra a entrada, aplica SHA-256 nela e mostra o resultado. Isso funciona para password, 123456 e uma longa cauda de outras strings curtas. E falha silenciosamente com qualquer outra coisa, motivo pelo qual essas páginas costumam devolver um resultado em branco sem explicação nenhuma.

Um número surpreendente delas não faz nada. Umas simplesmente reexibem a sua entrada; outras aplicam SHA-256 na string hexadecimal que você colou e entregam o resultado como se fosse o SHA-256 dos seus dados originais. Esses dois valores são diferentes, e a seção sobre hash duplo, mais abaixo, mostra o quanto.

O teste é rápido. Dê à página uma string hexadecimal de 32 caracteres e mais nada, e pergunte se ela teria como saber a entrada. Se ainda assim ela devolver um resultado de 64 caracteres e chamar isso de conversão, ou está consultando uma tabela ou está mentindo para você. Um conversor de hash que nunca pede os seus dados originais não tem como acertar, a não ser por coincidência.

A expressão sobrevive porque soa como uma operação vizinha que realmente funciona. A confusão começa aí.

Hash, codificação e criptografia: apenas dois dos três são reversíveis

Quem desenvolve esbarra nos três na mesma semana e guarda tudo na mesma gaveta mental. Eles se comportam de maneiras completamente diferentes:

OperaçãoExemploReversível?O que você precisa
CodificaçãoBase64, hex, URL-encodingSim, sempreAbsolutamente nada
CriptografiaAES, RSASimA chave
HashMD5, SHA-1, SHA-256NuncaNada resolve

O Base64 é o que treina a intuição errada. Qualquer pessoa consegue decodificar uma string Base64 de volta aos seus bytes, sem chave e sem permissão, e converter Base64 em hex é uma operação legítima e corriqueira. Os dois são apenas grafias alternativas dos mesmos bytes. Se você já viu isso funcionar, “MD5 para SHA-256” soa como o mesmo tipo de reescrita.

Só que não é. A codificação preserva cada bit da entrada, a criptografia a preserva atrás de uma chave, e o hash joga quase tudo fora. Um digest MD5 tem 16 bytes, não importa se você alimentou nele uma senha ou uma imagem de disco de 40 GB. Os 40 GB não foram parar em nenhum lugar engenhoso; eles se foram. O FAQ da ferramenta MD5 trata da comparação com criptografia em mais detalhe, mas a versão de uma linha basta aqui: não existe chave, então não existe nada para descriptografar.

”O MD5 está quebrado” não significa “o MD5 é reversível”

Este é o ponto que até artigos honestos erram, e ele importa porque as pessoas raciocinam de “o MD5 foi quebrado anos atrás” direto para “então a esta altura alguém já deve conseguir desfazê-lo”.

Há dois ataques diferentes envolvidos:

  • Um ataque de colisão encontra duas entradas diferentes que produzem o mesmo digest. Quem ataca escolhe as duas entradas e não se importa com o conteúdo delas.
  • Um ataque de pré-imagem parte de um digest e recupera uma entrada que o produz. É esse que permitiria converter MD5 em SHA-256, porque devolveria algo para alimentar o SHA-256.

A resistência a colisões do MD5 caiu em 2004, e hoje uma colisão pode ser construída em hardware comum em questão de segundos. É por isso que o MD5 é inadequado para assinaturas, certificados e qualquer coisa que um adversário possa influenciar.

A resistência a pré-imagem do MD5 não caiu. O melhor ataque de pré-imagem conhecido continua sendo teórico, com complexidade de 2^123.4 (Sasaki e Aoki, 2009). Isso é mais rápido que a força bruta por um fio de cabelo e inalcançável por qualquer margem que importe. Ninguém está invertendo digests MD5 arbitrários, nem em 2004 nem agora.

Então os dois fatos convivem sem contradição: o MD5 está quebrado, e o MD5 continua não sendo reversível. Nada do que este artigo afirma muda por causa da quebra. Se você está escolhendo entre os dois algoritmos para um sistema novo, em vez de tentar converter um no outro, a comparação entre MD5 e SHA-256 cobre essa decisão.

As quatro tarefas por trás da busca, e o que fazer em cada uma

O que você está tentando fazerO que resolve
Verificar um download ou comparar checksumsRecalcule a partir do arquivo com o algoritmo de que você precisa
Migrar hashes de senha em MD5Envolva-os em bcrypt e atualize no login
Recuperar a entrada originalIsso é quebra de hash, não conversão, e depende da entropia
Hashear os mesmos dados com outro algoritmoVolte aos bytes de origem

Tarefa 1: você está comparando checksums ou verificando um download

Recalcule, não converta. Você tem o arquivo ali no disco, ou seja, tem justamente aquilo que o digest perdeu. Rode contra ele o algoritmo de que precisar:

# GNU coreutils
md5sum    ubuntu-24.04-desktop-amd64.iso
sha256sum ubuntu-24.04-desktop-amd64.iso

# macOS
md5           ubuntu-24.04-desktop-amd64.iso
shasum -a 256 ubuntu-24.04-desktop-amd64.iso

O descompasso em que as pessoas esbarram é um publicador que divulga apenas um MD5 enquanto a sua política de segurança exige SHA-256. Converter o MD5 publicado não provaria nada, mesmo que fosse possível, porque um digest derivado de outro digest não é uma declaração do publicador sobre o arquivo. O que você precisa é de um SHA-256 assinado pelo publicador. Se ele não oferecer nenhum, calcular o seu próprio SHA-256 com o gerador de SHA-256 ainda entrega uma impressão digital estável para uso interno: você pode fixá-la, compará-la entre espelhos e detectar mudanças depois. Ela só não substitui o atestado do publicador.

Tarefa 2: você está migrando um banco de senhas para fora do MD5

Esta é a tarefa com mais em jogo, e ela tem uma solução consagrada: envolva os hashes antigos e depois atualize cada conta de forma transparente no login. Você aplica bcrypt em cada hash MD5 armazenado em um único job em lote e, a partir daí, o caminho de login aplica MD5 na senha enviada e compara o resultado com o registro bcrypt.

Um aviso antes, porque muito conselho antigo entende isso ao contrário. Envolver MD5 em SHA-256 não torna o armazenamento de senhas seguro. O SHA-256 é um hash rápido, a mesma categoria de problema que o MD5, e as GPUs devoram os dois a taxas enormes. Conselhos que apontam a função SHA2() embutida do banco de dados como solução estão resolvendo o problema errado. O alvo é um hash deliberadamente lento: bcrypt, scrypt ou Argon2. Armazene bcrypt(md5(password)), nunca sha256(md5(password)). A comparação entre bcrypt, Argon2 e scrypt mostra como escolher entre os três, e o gerador de bcrypt deixa você testar fatores de custo antes de se comprometer com um.

Agora a parte que de fato quebra migrações. “O MD5 da senha” é ambíguo, e as duas leituras produzem resultados diferentes:

const { createHash } = require('node:crypto');

const md5Hex = createHash('md5').update('hello').digest('hex');
const md5Raw = createHash('md5').update('hello').digest();   // the same value as 16 bytes

createHash('sha256').update(md5Hex).digest('hex');
// 4914e23374bb211e3dca0df7636fefffc7fedd94f1340ae81c7d6c07b7113e9b

createHash('sha256').update(md5Raw).digest('hex');
// 88e20f0abb88153e3f0a9683668ccb5b84ed771817dc448a2b73254ed02c8d8c

createHash('sha256').update('hello').digest('hex');
// 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

Três resultados, todos corretos, todos diferentes. Aplique o hash na string hexadecimal de 32 caracteres e você obtém um valor; aplique nos 16 bytes brutos que ela representa e obtém outro; aplique na senha original e obtém um terceiro. Escolha uma convenção, anote-a e use a mesma no script de migração e no caminho de login. Errar isso tranca todos os usuários de uma vez, e o sintoma parece um bug do bcrypt em vez de uma decisão de codificação.

Para um wrapper de bcrypt, hex é a convenção mais segura. Os bytes brutos de um digest podem conter um byte zero, e várias implementações de bcrypt tratam a entrada como uma string C e param de ler ali. Hex evita isso por completo e, com 32 caracteres, fica bem abaixo do limite de comprimento de entrada do bcrypt. Normalize também a caixa das letras, já que 5D41402A... e 5d41402a... são strings diferentes para o bcrypt, ainda que sejam o mesmo digest.

const bcrypt = require('bcrypt');
const { createHash } = require('node:crypto');

const legacyDigest = (password) =>
  createHash('md5').update(password, 'utf8').digest('hex');   // lowercase hex

// Batch job, run once: wrap each stored MD5, then drop the old column.
async function wrapRow(row) {
  return bcrypt.hash(row.md5_hash.toLowerCase(), 12);
}

// Login path
async function verify(password, row) {
  if (row.scheme === 'bcrypt') {
    return bcrypt.compare(password, row.hash);
  }
  const ok = await bcrypt.compare(legacyDigest(password), row.hash);
  if (ok) {
    const upgraded = await bcrypt.hash(password, 12);
    await saveCredential(row.id, { scheme: 'bcrypt', hash: upgraded });  // your DB write
  }
  return ok;
}

As contas migram para bcrypt puro conforme seus donos fazem login. Defina um prazo para os retardatários e force uma redefinição depois dele.

Tarefa 3: você está tentando recuperar a entrada original

Diga isso com todas as letras, pelo menos para você mesmo, porque muda as ferramentas e as expectativas. Recuperar uma entrada a partir de um digest é quebra de hash, não conversão, e o fato de dar certo ou não nada tem a ver com qual algoritmo produziu o digest. Depende da entrada.

Strings curtas, comuns e escolhidas por gente caem rápido. Palavras de dicionário, nomes com um dígito no fim e qualquer coisa que já tenha aparecido em um vazamento caem por consulta a tabela ou por uma rodada curta de força bruta. Strings longas e aleatórias não caem de jeito nenhum, e a distância entre os dois casos não se resolve comprando mais hardware.

O caso das rainbow tables merece uma formulação exata, porque a que circula por aí é vaga. Uma rainbow table recupera uma entrada apenas quando essa entrada foi hasheada sem sal e já está presente na tabela. As duas condições são obrigatórias. Adicione um sal por usuário e a tabela pré-computada não vale nada, porque quem ataca precisaria de uma tabela separada para cada sal. Alimente o hash com um token aleatório de 128 bits e nenhuma tabela do mundo o contém. O guia de entropia de senhas coloca números em onde fica essa fronteira.

Se a entrada era uma senha sua e você não consegue reproduzi-la, trate o caso como redefinição, não como recuperação. Se ela pertence a outra pessoa, o nome honesto para o que você está fazendo é o de cima.

Tarefa 4: você precisa dos mesmos dados hasheados com outro algoritmo (“md5 to sha1 converter”)

Mesmo formato da Tarefa 1, generalizado. O par de algoritmos do pedido não importa, porque a resposta é sempre voltar aos bytes de origem e aplicar o hash de novo:

sha1sum   payload.bin
sha256sum payload.bin

Todo “md5 to sha1 converter” que você encontrar é um re-hasheador ou uma tabela de consulta, pelos mesmos motivos já vistos. Se os dados originais não estiverem disponíveis, a tarefa não tem solução, e isso não é uma limitação das ferramentas existentes. Escolha o algoritmo de destino com a comparação da família SHA; o gerador de SHA-1 está lá para sistemas legados que ainda o exigem, embora nada novo deva exigir.

O único caso em que a consulta de um conversor de hash realmente funciona

Há uma exceção, e ela não é a que os conversores anunciam.

Há classes de dados que alguém coleta de forma centralizada e indexa sob todos os digests comuns de uma vez. Amostras de malware são o exemplo clássico. Serviços como o VirusTotal guardam a própria amostra, então calcularam MD5, SHA-1 e SHA-256 a partir dos mesmos bytes e arquivaram os três sob um único registro. Busque lá o MD5 de uma amostra e você recebe o SHA-256 dela de volta.

Isso é um join de banco de dados, não uma conversão. Funciona porque alguém teve o arquivo original e o hasheou com todos os algoritmos, exatamente o passo de recálculo descrito acima, só que feito de antemão por um terceiro. As condições são estritas: o objeto já precisa estar no índice, e você precisa confiar em quem o construiu. Fluxos de trabalho de threat intel dependem disso diariamente. Isso não diz nada sobre digests MD5 arbitrários, e nunca vai ajudar com um hash dos seus próprios dados.

O mecanismo é o mesmo que as páginas duvidosas de conversão usam. A diferença é que um repositório de malware avisa que aquilo é uma consulta e mostra o registro.

Teste você mesmo

O jeito mais rápido de se convencer disso é ver dois digests da mesma entrada mudarem juntos sem manter relação alguma:

$ printf 'hello' | md5sum
5d41402abc4b2a76b9719d911017c592  -
$ printf 'hello' | sha256sum
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824  -

Mude um caractere e as duas saídas mudam por completo, de formas que nada têm a ver uma com a outra. Cole o mesmo texto no gerador de hash MD5 e no gerador de SHA-256 lado a lado para ver isso ao vivo, ou recorra ao gerador de HMAC quando o que você precisa de fato é um digest com chave para assinar uma requisição de API. Os três rodam inteiramente no seu navegador.

FAQ

Dá para converter MD5 em SHA-256?

Não. Um digest MD5 não contém a entrada original, e o SHA-256 precisa dessa entrada para produzir qualquer coisa. Toda página que afirma converter ou está re-hasheando um texto que você fornece ou está consultando o valor em um banco de pares pré-computados.

Por que tantos sites oferecem um “conversor de MD5 para SHA-256”?

Eles ranqueiam para uma busca que as pessoas digitam. Uma vez lá, a página ou pede o seu texto original, o que a torna um re-hash e não uma conversão, ou não devolve nada útil. A expressão continua viva porque o equívoco por trás dela é comum.

É possível converter SHA-256 de volta para MD5?

Não, e a direção não muda nada. As duas são funções unidirecionais, então nenhum dos digests pode virar o outro sem a entrada original. Uma ferramenta que oferece o caminho inverso está rodando o mesmo truque de consulta ou de re-hash.

O MD5 está quebrado, então isso não quer dizer que ele pode ser revertido?

Não. A resistência a colisões do MD5 caiu em 2004, o que significa que duas entradas podem ser forçadas a compartilhar um digest. Reverter um digest é um ataque de pré-imagem, e o melhor conhecido ainda custa 2^123.4 operações. Quebrado para assinaturas, mas ainda assim não invertível.

Como migro um banco de hashes de senha em MD5 para algo mais seguro?

No MySQL, o UPDATE users SET password = SHA2(password, 256) que parece a solução óbvia está errado, pois aplica hash no digest MD5 armazenado e não na senha, então armazene bcrypt(md5(password)) e verifique pelo mesmo wrapper, atualizando cada registro no próximo login bem-sucedido. Envolver MD5 em SHA-256 não ajuda, porque ambos são hashes rápidos e uma GPU dá conta dos dois na mesma velocidade.

Por que o hash duplo me deu um resultado diferente do esperado?

Aplicar hash na string hexadecimal do MD5 e aplicar nos seus 16 bytes brutos produz saídas SHA-256 diferentes. As duas são válidas; são simplesmente entradas diferentes. Escolha uma convenção e aplique-a de forma idêntica no script de migração e no caminho de login.

Uma rainbow table consegue recuperar a entrada por trás de um hash MD5?

Só quando a entrada não tinha sal e já está presente na tabela, o que na prática significa strings curtas ou comuns. Entradas longas e aleatórias não são recuperáveis assim, e adicionar um sal por usuário derrota tabelas pré-computadas por completo.

Existe um conversor de MD5 para SHA-1?

Não. Todo suposto conversor de MD5 para SHA-1 é um re-hasheador ou uma tabela de consulta, porque a mesma propriedade unidirecional bloqueia MD5 para SHA-1 exatamente como bloqueia MD5 para SHA-256. Com a entrada original em mãos, você recalcula com o gerador SHA-1; sem ela, nada resolve.

Tags: md5 sha-256 hashing security checksum cryptography

Artigos relacionados

Ver todos os artigos