¿Convertir MD5 a SHA-256? Por qué es imposible y qué hacer
Hay páginas de sobra que prometen hacerlo, y algunas incluso parecen herramientas que funcionan. La operación que anuncian no existe, y el motivo importa porque cambia lo que deberías hacer a continuación.
La respuesta corta: no puedes convertir MD5 a SHA-256 (ni SHA-256 a MD5)
No puedes convertir un hash MD5 a SHA-256. Un resumen MD5 (digest) son 128 bits de salida que no contienen la entrada que los produjo. SHA-256 necesita esa entrada para poder calcular cualquier cosa. Sin los datos originales, el paso intermedio falta de forma permanente, y no hay herramienta ni biblioteca que lo rellene.
Esta es la misma entrada bajo tres algoritmos:
| Algoritmo | Resumen de hello | Caracteres hex | Bits |
|---|---|---|---|
| MD5 | 5d41402abc4b2a76b9719d911017c592 | 32 | 128 |
| SHA-1 | aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d | 40 | 160 |
| SHA-256 | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 | 64 | 256 |
Mira los tres resúmenes como cadenas de texto. No comparten prefijo, ni subcadena, ni relación aritmética alguna. Lo único que los conecta es la palabra hello, y ninguno de ellos la lleva dentro. Calcúlalos tú mismo con el generador de hash MD5 y el generador SHA-256 si quieres ver cómo ambos cambian de forma independiente mientras escribes.
La dirección tampoco cambia nada. Ir de SHA-256 a MD5 falla exactamente por lo mismo: las dos funciones destruyen información a propósito, así que ninguno de los dos resúmenes puede devolverse hasta la entrada que el otro necesitaría.
Queda entonces la otra pregunta. Nadie escribe esta búsqueda por curiosidad teórica sobre funciones hash, así que ¿qué estabas intentando hacer? En la práctica es una de estas cuatro tareas, y las cuatro tienen solución:
- Verificar una descarga o comparar sumas de verificación
- Migrar una base de datos de contraseñas fuera de MD5
- Recuperar la entrada original que hay detrás de un hash
- Obtener los mismos datos hasheados con otro algoritmo
Cada una se cubre más abajo. Antes conviene saber qué hacen las páginas que prometen la conversión, porque reconocer el patrón evita que te fíes de la salida de una de ellas.
Qué hace realmente una página de «conversor de MD5 a SHA-256»
Solo hay tres posibilidades, y ninguna es una conversión.
La primera te pide el texto original. Pegas una cadena, la página produce ambos resúmenes y el texto de marketing lo llama conversión. Es un generador de hash con una etiqueta engañosa: no se convirtió nada, la entrada se hasheó dos veces.
La segunda busca el resumen en una tabla. La página mantiene una tabla de pares entrada-resumen recolectados de listas de palabras y de filtraciones de credenciales. Pega un MD5 cuya entrada esté ahí y la página la encuentra, la hashea con SHA-256 y te muestra el resultado. Funciona con password, 123456 y una larga cola de otras cadenas cortas. Con cualquier otra cosa falla en silencio, y por eso estas páginas suelen devolver un resultado en blanco sin ninguna explicación.
La tercera no hace nada. Un número sorprendente de estas páginas simplemente vuelve a mostrar tu entrada, o emite un SHA-256 de la cadena hexadecimal que pegaste dando a entender que es el SHA-256 de tus datos originales. Esos dos valores son distintos, y la sección sobre el doble hasheo que viene más abajo muestra cuánto.
La prueba es rápida. Dale a la página una cadena hexadecimal de 32 caracteres y nada más, y pregúntate si podría llegar a conocer la entrada. Si aun así devuelve un resultado de 64 caracteres y lo llama conversión, o está consultando una tabla o te está mintiendo. Un conversor de hash que nunca te pide tus datos originales no tiene forma de acertar salvo por casualidad.
La expresión sobrevive porque suena a algo parecido que sí funciona, y de ahí viene la confusión.
Hash, codificación y cifrado: solo dos de los tres son reversibles
Los desarrolladores se topan con los tres en la misma semana y los guardan en el mismo cajón mental. Se comportan de manera completamente distinta:
| Operación | Ejemplo | ¿Reversible? | Qué necesitas |
|---|---|---|---|
| Codificación | Base64, hex, codificación URL | Sí, siempre | Nada en absoluto |
| Cifrado | AES, RSA | Sí | La clave |
| Hash | MD5, SHA-1, SHA-256 | Nunca | Nada ayuda |
Base64 es el que entrena la intuición equivocada. Cualquiera puede decodificar una cadena Base64 y recuperar sus bytes sin clave y sin permiso, y convertir Base64 a hexadecimal es una operación legítima y cotidiana. Ambos son solo formas alternativas de escribir los mismos bytes. Si has visto eso funcionar, «MD5 a SHA-256» suena a la misma clase de reescritura.
No lo es. La codificación conserva cada bit de la entrada, el cifrado lo conserva detrás de una clave y el hash tira casi todo. Un resumen MD5 ocupa 16 bytes sin importar si le diste una contraseña o una imagen de disco de 40 GB. Esos 40 GB no se fueron a ningún lugar ingenioso; desaparecieron. Las preguntas frecuentes de la herramienta MD5 cubren la comparación con el cifrado en más detalle si te interesa, pero aquí basta con la versión de una línea: no hay clave, así que no hay nada que descifrar.
«MD5 está roto» no significa «MD5 es reversible»
Este es el punto que hasta los artículos honestos entienden mal, y pesa porque la gente razona desde «MD5 se rompió hace años» directo a «entonces seguro que alguien ya puede deshacerlo».
Hay dos ataques distintos en juego:
- Un ataque de colisión encuentra dos entradas diferentes que producen el mismo resumen. El atacante elige las dos entradas y no le importa cuáles sean.
- Un ataque de preimagen parte de un resumen y recupera una entrada que lo produce. Este es el que permitiría convertir MD5 a SHA-256, porque te devolvería algo que darle a SHA-256.
La resistencia a colisiones de MD5 cayó en 2004, y hoy se puede construir una colisión en hardware corriente en cuestión de segundos. Por eso MD5 no sirve para firmas, certificados ni nada en lo que un adversario pueda influir.
La resistencia a preimagen de MD5 no ha caído. El mejor ataque de preimagen conocido sigue siendo teórico, con una complejidad de 2^123.4 (Sasaki y Aoki, 2009). Eso es más rápido que la fuerza bruta por un pelo e inalcanzable por cualquier margen que importe. Nadie está invirtiendo resúmenes MD5 arbitrarios, ni en 2004 ni ahora.
Así que los dos hechos conviven sin contradecirse: MD5 está roto y MD5 sigue sin ser reversible. Que esté roto no lo acerca ni un paso a ser invertible. Si lo que estás haciendo es elegir entre los dos algoritmos para un sistema nuevo, en lugar de intentar convertir de uno al otro, la comparación entre MD5 y SHA-256 cubre esa decisión como corresponde.
Cuatro tareas y la respuesta para cada una
| Lo que estás haciendo | Qué hacer |
|---|---|
| Verificar una descarga o comparar sumas de verificación | Recalcula desde el archivo con el algoritmo que necesitas |
| Migrar hashes MD5 de contraseñas | Envuélvelos en bcrypt y actualízalos al iniciar sesión |
| Recuperar la entrada original | Eso es crackear, no convertir, y depende de la entropía |
| Rehashear los mismos datos con otro algoritmo | Vuelve a los bytes de origen |
Tarea 1: Estás comparando sumas de verificación o verificando una descarga
Recalcula, no conviertas. Tienes el archivo ahí en el disco, o sea que tienes justo lo único que el resumen perdió. Ejecuta contra él el algoritmo que necesites:
# 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
El desajuste con el que se topa la gente es un publicador que solo lista un MD5 mientras tu política de seguridad exige SHA-256. Convertir el MD5 publicado no probaría nada aunque fuera posible, porque un resumen que derivaste de otro resumen no es una declaración del publicador acerca del archivo. Lo que necesitas es un SHA-256 que el publicador haya firmado. Si no ofrecen ninguno, calcular tu propio SHA-256 con el generador SHA-256 igual te da una huella estable para uso interno: puedes fijarla, compararla entre espejos y detectar cambios más adelante. Lo único que no puede es sustituir la declaración del publicador.
Tarea 2: Estás migrando una base de datos de contraseñas fuera de MD5
Esta es la tarea con más en juego, y tiene una solución muy rodada: envuelve los hashes viejos y luego actualiza cada cuenta de forma transparente al iniciar sesión. Aplicas bcrypt a cada hash MD5 almacenado en un único trabajo por lotes, y a partir de ahí la ruta de inicio de sesión primero calcula el MD5 de la contraseña enviada y compara eso contra el registro bcrypt.
Muchos consejos antiguos lo tienen al revés: envolver MD5 en SHA-256 no vuelve seguro el almacenamiento de contraseñas. SHA-256 es un hash rápido, la misma categoría de problema que MD5, y las GPU devoran los dos a un ritmo enorme. Los consejos que te mandan a la función SHA2() integrada de una base de datos como solución están resolviendo el problema equivocado. El objetivo es un hash deliberadamente lento: bcrypt, scrypt o Argon2. Guarda bcrypt(md5(password)), nunca sha256(md5(password)). La comparación entre bcrypt, Argon2 y scrypt explica cómo elegir entre los tres, y el generador bcrypt te deja probar factores de costo antes de comprometerte con uno.
Lo que rompe las migraciones suele ser otra cosa: «el MD5 de la contraseña» es ambiguo, y las dos lecturas producen resultados distintos:
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
Tres resultados distintos, y los tres son correctos. Hashea la cadena hexadecimal de 32 caracteres y obtienes un valor; hashea los 16 bytes crudos que esa cadena representa y obtienes otro; hashea la contraseña original y obtienes un tercero. Elige una convención, déjala por escrito y usa la misma en el script de migración y en la ruta de inicio de sesión. Equivocarte aquí bloquea a todos los usuarios de golpe, y el síntoma parece un bug de bcrypt en vez de una decisión de codificación.
Para un envoltorio bcrypt, el hexadecimal es la convención más segura. Los bytes crudos de un resumen pueden contener un byte cero, y varias implementaciones de bcrypt tratan su entrada como una cadena de C y dejan de leer justo ahí. El hexadecimal evita eso por completo, y con 32 caracteres se queda muy por debajo del límite de longitud de entrada de bcrypt. Normaliza también las mayúsculas, porque 5D41402A... y 5d41402a... son cadenas distintas para bcrypt aunque sean el mismo resumen.
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;
}
Las cuentas van pasando a bcrypt puro a medida que sus dueños inician sesión. Ponle una fecha límite a los rezagados y fuerza un restablecimiento cuando se cumpla.
Tarea 3: Estás intentando recuperar la entrada original
Dilo con todas las letras, aunque sea solo para ti, porque cambia las herramientas y las expectativas. Recuperar una entrada a partir de un resumen es crackear, no convertir, y que funcione o no no tiene nada que ver con qué algoritmo produjo el resumen. Depende de la entrada.
Las cadenas cortas, comunes y elegidas por humanos caen rápido. Las palabras de diccionario, los nombres con un dígito al final y cualquier cosa que haya aparecido en un corpus de filtraciones caen ante una búsqueda en tabla o una ronda corta de fuerza bruta. Las cadenas largas y aleatorias no caen en absoluto, y la distancia entre los dos casos no se salva comprando más hardware.
Una tabla rainbow recupera una entrada solo cuando esa entrada se hasheó sin sal y ya está presente en la tabla. Hacen falta las dos condiciones. Agrega una sal por usuario y la tabla precalculada no vale nada, porque el atacante necesitaría una tabla distinta por cada sal. Dale al hash un token aleatorio de 128 bits y no hay tabla en el mundo que lo contenga. La guía de entropía de contraseñas le pone números a dónde está esa frontera.
Si la entrada era una contraseña tuya y no puedes reproducirla, trátalo como un restablecimiento, no como una recuperación. Si le pertenece a otra persona, el planteamiento honesto es el de arriba.
Tarea 4: Necesitas los mismos datos hasheados con otro algoritmo («conversor de md5 a sha1»)
La misma forma que la Tarea 1, generalizada. Da igual qué par de algoritmos pida la consulta, porque la respuesta siempre es volver a los bytes de origen y hashearlos otra vez:
sha1sum payload.bin
sha256sum payload.bin
Todo «conversor de md5 a sha1» que encuentres es un rehasheador o una tabla de búsqueda, por las mismas razones que ya vimos. Si los datos originales no están disponibles, la tarea no tiene solución, y eso no es una limitación de las herramientas que hay. Elige el algoritmo de destino con la comparación de la familia SHA; el generador SHA-1 está ahí para los sistemas heredados que todavía lo exigen, aunque nada nuevo debería.
El único caso en que la búsqueda de un conversor de hash sí funciona
Algunas clases de datos se recopilan de forma centralizada y se indexan a la vez por todos los resúmenes habituales. Las muestras de malware son el ejemplo estándar. Servicios como VirusTotal guardan la muestra en sí, así que han calculado su MD5, su SHA-1 y su SHA-256 a partir de los mismos bytes y han archivado los tres contra un mismo registro. Busca ahí el MD5 de una muestra y te devuelve su SHA-256.
Eso es un join de base de datos, no una conversión. Funciona porque alguien tuvo el archivo original y lo hasheó con todos los algoritmos, exactamente el paso de recalcular que describimos arriba, solo que hecho por adelantado por un tercero. Las condiciones son estrictas: el objeto ya tiene que estar en el índice, y tienes que confiar en quien lo construyó. Los flujos de trabajo de inteligencia de amenazas dependen de esto a diario. No dice nada sobre resúmenes MD5 arbitrarios, y nunca te va a servir para un hash de tus propios datos.
El mecanismo es el mismo que usan las páginas de conversores turbios. La diferencia es que un repositorio de malware te dice que es una búsqueda en un índice y te muestra el registro.
Pruébalo tú mismo
La forma más rápida de verlo es mirar cómo dos resúmenes de la misma entrada cambian a la vez sin guardar ninguna relación entre sí:
$ printf 'hello' | md5sum
5d41402abc4b2a76b9719d911017c592 -
$ printf 'hello' | sha256sum
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 -
Cambia un carácter y las dos salidas cambian por completo, de maneras que no tienen nada que ver entre sí. Pega el mismo texto en el generador de hash MD5 y en el generador SHA-256, uno al lado del otro, para verlo en vivo, o recurre al generador HMAC cuando lo que necesitas es un resumen con clave para firmar una petición a una API. Los tres se ejecutan por completo en tu navegador.
Preguntas frecuentes
¿Se puede convertir MD5 a SHA-256?
No. Un resumen MD5 no contiene la entrada original, y SHA-256 necesita esa entrada para producir cualquier cosa. Cualquier página que afirme convertir o está rehasheando el texto que tú le das, o está buscando el valor en una base de datos de pares precalculados.
¿Por qué tantos sitios ofrecen un «conversor de MD5 a SHA-256»?
Porque posicionan para una búsqueda que la gente escribe. Una vez que llegas ahí, la página o te pide tu texto original, lo que la convierte en un rehasheo y no en una conversión, o no devuelve nada útil. La expresión sobrevive porque el malentendido que hay detrás es muy común.
¿Es posible convertir SHA-256 de vuelta a MD5?
No, y la dirección no importa. Las dos son funciones unidireccionales, así que ninguno de los resúmenes puede transformarse en el otro sin la entrada original. Una herramienta que ofrezca el viaje inverso está haciendo el mismo truco de búsqueda en tabla o de rehasheo.
MD5 está roto, ¿eso no significa que se puede revertir?
No. La resistencia a colisiones de MD5 cayó en 2004, o sea que se pueden forzar dos entradas para que compartan resumen. Revertir un resumen es un ataque de preimagen, y el mejor conocido todavía cuesta 2^123.4 operaciones. Roto para firmas, pero sigue sin ser invertible.
¿Cómo migro una base de datos de hashes MD5 de contraseñas a algo más seguro?
En MySQL, UPDATE users SET password = SHA2(password, 256) es un error: hashea el resumen MD5 almacenado, no la contraseña. Guarda bcrypt(md5(password)), verifica a través del mismo envoltorio y actualiza cada registro en el siguiente inicio de sesión exitoso. Envolver MD5 en SHA-256 no ayuda, porque los dos son hashes rápidos y una GPU se come cualquiera de los dos a la misma velocidad.
¿Por qué el doble hasheo me dio un resultado distinto al esperado?
Hashear la cadena hexadecimal del MD5 y hashear sus 16 bytes crudos producen salidas SHA-256 distintas. Las dos son válidas; simplemente son entradas distintas. Elige una convención y aplícala de forma idéntica en el script de migración y en la ruta de inicio de sesión.
¿Puede una tabla rainbow recuperar la entrada que hay detrás de un hash MD5?
Solo cuando la entrada estaba sin sal y ya está presente en la tabla, lo que en la práctica significa cadenas cortas o comunes. Las entradas largas y aleatorias no se recuperan así, y agregar una sal por usuario derrota por completo a las tablas precalculadas.
¿Existe un conversor de MD5 a SHA-1?
No. Cualquier «conversor de MD5 a SHA-1» es un rehasheador o una tabla de búsqueda, porque la misma propiedad unidireccional bloquea el paso de MD5 a SHA-1 igual que bloquea el de MD5 a SHA-256. Si conservas la entrada original, recalcula el hash con el generador SHA-1; sin ella, nada puede hacerlo.