0Pricing
PHP Academy · Lección

Almacenamiento seguro de contraseñas

Genere hashes de contraseñas con password_hash y verifíquelos con password_verify.

Almacenamiento seguro de contraseñas es una lección gratuita de PHP Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de PHP Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de PHP Academy incluye 4 lecciones en total.

No almacene contraseñas en texto plano

Almacenar contraseñas en texto plano significa que una filtración de la base de datos expone la contraseña de cada usuario. Almacene siempre un hash criptográfico, idealmente bcrypt, Argon2id o scrypt.

password_hash()

password_hash(), la función integrada de PHP, crea un hash seguro con un salt aleatorio incluido en el resultado.

<?php
$hash = password_hash("mysecretpassword", PASSWORD_BCRYPT);
// Output: $2y$10$... (includes algorithm, cost, salt, hash)

password_verify()

Verifica una contraseña en texto plano frente a un hash almacenado.

<?php
$hash  = "$2y$10$abcdef...";
$valid = password_verify("mysecretpassword", $hash);
if ($valid) {
    echo "Correct password!";
}

Opciones de algoritmos

PHP admite:

  • PASSWORD_BCRYPT — ampliamente compatible, con un límite de 72 bytes
  • PASSWORD_ARGON2I — exige mucha memoria (PHP 7.2+)
  • PASSWORD_ARGON2ID — recomendado, resistente a ataques mediante GPU (PHP 7.3+)
  • PASSWORD_DEFAULT — actualmente bcrypt, aunque puede cambiar en futuras versiones de PHP

Factor de coste

El factor de coste controla la duración del cálculo del hash. Un coste mayor ralentiza los ataques de fuerza bruta. El coste predeterminado de bcrypt es 10.

<?php
$hash = password_hash("secret", PASSWORD_BCRYPT, ["cost" => 12]);
// Cost 12 takes ~0.5s on typical hardware — acceptable for login

password_needs_rehash()

Después de actualizar PHP o cambiar la configuración del coste, compruebe si es necesario actualizar los hashes existentes.

<?php
if (password_verify($plain, $storedHash) &&
    password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
    $user->update(["password" => password_hash($plain, PASSWORD_DEFAULT)]);
}

Fachada Hash de Laravel

Laravel encapsula password_hash en la fachada Hash, que utiliza bcrypt de forma predeterminada.

<?php
use Illuminate\Support\Facades\Hash;

$hash  = Hash::make("mysecretpassword");
$valid = Hash::check("mysecretpassword", $hash); // true

Argon2 en Laravel

Configure Laravel para utilizar Argon2id en config/hashing.php.

// config/hashing.php
"driver" => "argon2id",

Gestión del salt

Las funciones modernas de hashing de PHP incluyen automáticamente un salt criptográficamente aleatorio. No implemente nunca su propio salt: es fácil hacerlo de forma incorrecta.

Pepper (secreto a nivel de aplicación)

Se puede combinar un secreto adicional opcional (pepper), almacenado fuera de la base de datos, antes de generar el hash. Aunque roben la base de datos, el atacante no podrá realizar un ataque de fuerza bruta sin el pepper.

Comparación resistente a ataques de temporización

password_verify() utiliza internamente una comparación de tiempo constante, lo que evita los ataques de temporización. No compare nunca hashes con ==.

Resumen

Use password_hash() con PASSWORD_DEFAULT o PASSWORD_ARGON2ID. Verifique con password_verify(). Vuelva a generar el hash al iniciar sesión si es necesario. No almacene nunca contraseñas en texto plano ni utilice MD5/SHA1 para contraseñas.

Comprobación rápida

¿Qué función verifica una contraseña frente a un hash generado por PHP?

Preguntas frecuentes

¿La lección «Almacenamiento seguro de contraseñas» es gratis?

Sí — el texto completo de «Almacenamiento seguro de contraseñas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de PHP Academy, actualiza a CoddyKit PRO. El curso de PHP Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Almacenamiento seguro de contraseñas»?

Genere hashes de contraseñas con password_hash y verifíquelos con password_verify. Practicas PHP Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar PHP Academy?

No se requiere experiencia previa. PHP Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Almacenamiento seguro de contraseñas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de PHP Academy?

Sí. Cada lección de PHP Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Prevención de cross-site scripting (XSS)
  2. Inyección SQL y consultas parametrizadas
  3. Protección contra CSRF
  4. Almacenamiento seguro de contraseñas
← Volver a PHP Academy