Desencriptar MD5 online: por qué MD5 no se puede descifrar y qué hacen realmente esas webs
Buscar «desencriptar MD5» es de lo más habitual, y la respuesta corta sorprende: un hash MD5 no se puede desencriptar, porque nunca estuvo cifrado. MD5 es una función hash de un solo sentido. Aun así, las webs de «md5 decrypt» a veces devuelven el texto original. No descifran nada: lo buscan en tablas enormes de hashes ya calculados. Entender esa diferencia explica cuándo funcionan, cuándo no, y qué deberías usar en tu aplicación.
Hash no es cifrado
El cifrado es reversible por diseño: con la clave correcta, AES convierte el texto cifrado de nuevo en el original. Un hash no tiene clave ni camino de vuelta. MD5 toma una entrada de cualquier tamaño, sea una palabra o un archivo de 4 GB, y produce siempre 128 bits, escritos como 32 caracteres hexadecimales.
MD5("") = d41d8cd98f00b204e9800998ecf8427e
MD5("hola") = 4d186321c1a7f0f354b297e8914ab240
MD5("123456") = e10adc3949ba59abbe56e057f20f883e
Como hay infinitas entradas posibles y solo 2¹²⁸ salidas, se pierde información: muchísimos textos distintos comparten cada hash. No existe un algoritmo que «deshaga» MD5 y te diga cuál de ellos era el original. Por eso ni PHP, ni MySQL, ni ningún otro lenguaje tiene una función para desencriptar MD5.
Qué hacen las webs de «md5 decrypt»
Guardan bases de datos con miles de millones de pares texto → hash: diccionarios de contraseñas filtradas, palabras de varios idiomas, combinaciones cortas de letras y números. Cuando pegas un hash, lo buscan. Si alguien calculó antes el MD5 de ese texto exacto, aparece; si no, la web no puede hacer nada.
Por eso e10adc3949ba59abbe56e057f20f883e se «descifra» al instante como 123456: es una de las contraseñas más usadas del mundo y está en todas las listas. Un hash de una frase larga y aleatoria no aparecerá nunca.
Las rainbow tables son una versión más compacta de la misma idea, y las herramientas de fuerza bruta como hashcat van más allá: prueban candidatos a gran velocidad. MD5 es tan rápido que una sola tarjeta gráfica moderna calcula decenas de miles de millones de hashes por segundo, así que cualquier contraseña de 8 caracteres o menos cae en poco tiempo.
Una advertencia práctica: pegar hashes de tu sistema en una web de terceros significa entregárselos. Si son hashes de contraseñas de usuarios reales, esa web puede guardarlos y añadir a su base lo que consiga romper.
Por qué MD5 ya no es seguro
MD5 tiene dos problemas distintos. El primero es la velocidad: una función hash rápida es exactamente lo que no quieres para contraseñas, porque acelera los ataques de fuerza bruta. La sal (un valor aleatorio por usuario) evita las tablas precalculadas, pero no hace MD5 más lento.
El segundo es que MD5 está roto criptográficamente. Desde 2004 se pueden generar colisiones, dos entradas diferentes con el mismo hash, en segundos con un ordenador normal. En 2008 se usó para falsificar un certificado de autoridad de certificación, y el malware Flame (2012) explotó una colisión MD5 para firmar código como si fuera de Microsoft. Por eso MD5 no debe usarse para firmas, certificados ni verificación frente a un atacante.
Si lo que necesitas es recuperar el texto: usa cifrado
Si tu aplicación necesita volver a leer el dato original, como un token de API de terceros o un número de documento, MD5 era la herramienta equivocada desde el principio. Necesitas cifrado simétrico con una clave guardada fuera de la base de datos.
<?php
// PHP: cifrado autenticado con libsodium (incluido desde PHP 7.2)
$clave = sodium_crypto_secretbox_keygen(); // guárdala en un gestor de secretos
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cifrado = sodium_crypto_secretbox('dato secreto', $nonce, $clave);
$original = sodium_crypto_secretbox_open($cifrado, $nonce, $clave); // 'dato secreto'
En MySQL existen AES_ENCRYPT() y AES_DECRYPT(), pero cifrar dentro de la base de datos obliga a enviar la clave en cada consulta, donde puede acabar en logs. Normalmente es mejor cifrar en la aplicación.
Si son contraseñas: no las desencriptes, verifícalas
Para contraseñas nunca necesitas el texto original. Al iniciar sesión, calculas el hash de lo que escribe el usuario y lo comparas con el guardado. Eso ya funciona con MD5, pero debe hacerse con un algoritmo lento y con sal: Argon2id o bcrypt, como recomienda OWASP.
<?php
// Registro
$hash = password_hash($password, PASSWORD_DEFAULT); // bcrypt hoy; PASSWORD_ARGON2ID si está disponible
// Inicio de sesión
if (password_verify($password, $hash)) {
// correcto
}
Si heredas una base de datos con contraseñas en MD5, no hace falta pedir a todos que las cambien. Migra de forma gradual: en el siguiente inicio de sesión correcto, verifica contra el MD5 antiguo y guarda un hash nuevo con password_hash(). Para las cuentas que no vuelvan a entrar, puedes envolver el MD5 existente en bcrypt, password_hash(md5_existente), y verificar después con password_verify(md5($password), $hash), hasta que el usuario inicie sesión y puedas sustituirlo.
Usos legítimos de MD5 hoy
MD5 sigue siendo útil donde no hay un atacante: detectar archivos duplicados, comprobar que una descarga no se corrompió por error, generar claves de caché o ETags, o repartir datos entre servidores. Para cualquier cosa relacionada con la seguridad, usa SHA-256 o superior.
# Calcular un MD5 (para integridad, no para seguridad)
md5sum archivo.zip # Linux
md5 archivo.zip # macOS
certutil -hashfile archivo.zip MD5 # Windows cmd
Get-FileHash archivo.zip -Algorithm MD5 # PowerShell
-- MySQL
SELECT MD5('hola'); -- 4d186321c1a7f0f354b297e8914ab240
Fuentes y lecturas recomendadas
RFC 1321 define MD5, y RFC 6151 documenta sus debilidades y desaconseja su uso en seguridad. El trabajo de Xiaoyun Wang y colaboradores (2004) mostró las primeras colisiones prácticas. La guía OWASP Password Storage Cheat Sheet recomienda Argon2id y bcrypt, y el manual de PHP documenta password_hash(), password_verify() y libsodium.
Frequently asked questions
¿Se puede desencriptar un hash MD5?
No. MD5 es una función hash de un solo sentido, no un cifrado, y no hay clave ni algoritmo para revertirlo. Las webs que «descifran» MD5 solo buscan el hash en bases de datos de textos ya conocidos.
¿Por qué una web encontró el texto de mi hash MD5?
Porque ese texto exacto ya estaba en su base de datos, normalmente porque es una contraseña común o corta. Los textos largos y aleatorios no aparecen en esas tablas.
¿Cómo desencriptar MD5 en PHP o MySQL?
No existe ninguna función para hacerlo, porque MD5 no es reversible. Si necesitas recuperar datos, cífralos con libsodium o AES; si son contraseñas, verifícalas con `password_hash()` y `password_verify()`.
¿Es seguro usar MD5 para contraseñas?
No. Es demasiado rápido y está roto para colisiones. Usa Argon2id o bcrypt, que son lentos a propósito e incluyen sal.
¿Cuántos caracteres tiene un hash MD5?
32 caracteres hexadecimales, que representan 16 bytes (128 bits), sea cual sea el tamaño de la entrada.
¿Para qué sirve MD5 hoy en día?
Para usos sin atacante: detectar duplicados, comprobar corrupción accidental de archivos, claves de caché o ETags. Para seguridad, usa SHA-256 o superior.