Hash seguro y sal para contraseñas en PHP
¡Hola a todos! Soy un desarrollador PHP principiante y estoy tratando de entender el almacenamiento seguro de contraseñas de usuarios. Actualmente uso MD5 con sal, pero me dijeron que no es seguro. Mi código actual se ve así:
```php
function createPassword($password) {
$salt = 'my_very_secret_salt_12345';
return md5($salt . $password);
}
function checkPassword($password, $hash) {
$salt = 'my_very_secret_salt_12345';
return md5($salt . $password) === $hash;
}
```
Entiendo que MD5 está obsoleto, pero no sé con qué reemplazarlo. He oído sobre bcrypt, password_hash y password_verify, pero no entiendo cómo usarlos correctamente.
Preguntas principales:
1. ¿Cómo generar correctamente una sal para cada contraseña?
2. ¿Necesito almacenar la sal por separado y cómo pasarla al verificar?
3. ¿Qué algoritmos se consideran seguros actualmente en PHP?
4. ¿Cómo protegerse contra ataques de fuerza bruta (brute force) y tablas rainbow?
Agradecería ejemplos de código detallados con explicaciones. Quiero entender no solo "cómo" hacerlo, sino también por qué ciertos métodos son mejores.