Hash y salt para contraseñas en PHP: mejores prácticas 2025

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Hash, salt y tu seguridad: ¿por qué es importante en 2025?

\n\n

Imagina esto: creaste un sitio web increíble, todo funciona, los usuarios se registran. Pero un día, la base de datos se filtra en la red. ¿Qué verán los atacantes? Si almacenas las contraseñas en texto plano, es una catástrofe. Si usas el viejo md5, es casi lo mismo. Pero si aplicas hash y salt seguro, los atacantes solo verán un conjunto de caracteres sin sentido. En 2025, esto no es solo una recomendación, es un estándar de seguridad.

\n\n

En este artículo, veremos cómo hashear contraseñas correctamente en PHP usando algoritmos modernos, salt y las mejores prácticas. Descubrirás por qué los métodos antiguos son peligrosos y cómo migrar a un almacenamiento seguro de contraseñas en solo 10 minutos.

\n\n

¿Por qué md5 y sha1 son el enemigo?

\n\n

Muchos desarrolladores novatos cometen el mismo error: usar md5($password) o sha1($password). En 2025, esto no es solo una mala práctica, es un camino directo a la vulnerabilidad. ¿Por qué?

\n\n
    \n
  • Velocidad de cómputo. MD5 y SHA1 fueron diseñados para la velocidad, no para la seguridad. Las GPU modernas pueden probar miles de millones de hashes por segundo.
  • \n
  • Falta de salt. Si dos usuarios eligen la misma contraseña, sus hashes serán idénticos. Esto permite el uso de tablas rainbow.
  • \n
  • Colisiones. Para MD5 se han encontrado colisiones prácticas: dos entradas diferentes producen el mismo hash.
  • \n
\n\n

Por suerte, PHP tiene funciones integradas que resuelven todos estos problemas. Y no necesitas instalar librerías externas.

\n\n

password_hash y password_verify: tu arma secreta

\n\n

Desde PHP 5.5.0, el lenguaje incluye dos funciones mágicas: password_hash() y password_verify(). Generan salt automáticamente, usan algoritmos criptográficamente seguros y protegen contra ataques de temporización.

\n\n

Ejemplo de uso básico:

\n\n
// Hashear la contraseña\n$password = "MiSuperClaveSegura@2025!";\n$hash = password_hash($password, PASSWORD_DEFAULT);\necho $hash; // $2y$10$...\n
\n\n

¿Qué pasó aquí? La función password_hash:

\n
    \n
  • Generó un salt aleatorio
  • \n
  • Seleccionó el algoritmo óptimo (por defecto bcrypt)
  • \n
  • Calculó el hash
  • \n
  • Devolvió una cadena que contiene el hash, el salt y la información del algoritmo
  • \n
\n\n

Verificar la contraseña es igual de simple:

\n\n
// Verificar la contraseña\n$inputPassword = "MiSuperClaveSegura@2025!";\nif (password_verify($inputPassword, $hash)) {\n    echo "¡Contraseña correcta!";\n} else {\n    echo "Contraseña incorrecta.";\n}\n
\n\n

Nota importante: no necesitas almacenar el salt por separado. Ya está incluido en el hash. Esto es hash y salt seguro en acción.

\n\n

¿Qué algoritmo elegir en 2025?

\n\n

Por defecto, password_hash usa bcrypt. Es una excelente opción para la mayoría de los proyectos. Pero tenemos otras alternativas:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
AlgoritmoConstanteRecomendación
BcryptPASSWORD_BCRYPTExcelente opción, compatible en todas partes
Argon2iPASSWORD_ARGON2IResistente a ataques de canal lateral
Argon2idPASSWORD_ARGON2IDLa mejor opción en 2025
\n\n

Argon2id es el ganador del concurso PHC (Password Hashing Competition). Es resistente tanto a ataques con GPU como a ataques de temporización. Si tu PHP está compilado con soporte para Argon2 (en PHP 8.x ya es estándar), úsalo.

\n\n

Ajustar el costo del hashing

\n\n

Una de las ideas clave del hash y salt seguro es hacer que el cálculo sea

Blogs

Book Recommendations