Ofuscación y Validación de Contraseñas en Yii Framework
Clase 22 de 35 • Curso de Desarrollo Web con PHP y Yii2
Resumen
¿Cómo asegurar contraseñas en Yii?
El marco de trabajo Yii ofrece múltiples herramientas para manejar de forma segura la información de usuario, especialmente las contraseñas. A través de las funciones before
y after
en cada paso del modelo, podemos realizar un tratamiento específico de los datos durante su procesamiento. Un ejemplo común es el manejo de contraseñas, donde debemos asegurarnos de que estén ofuscadas antes de guardarlas en la base de datos.
¿Qué son los métodos before save
y after save
?
Los métodos before save
y after save
pertenecen a la clase modelo de Yii y nos permiten ejecutar código antes y después de guardar los datos. Estos métodos facilitan el seguimiento de la información y permiten ejecutar tratamientos especiales, como ofuscar contraseñas.
Para ofuscar contraseñas, primero validamos que contengan los caracteres requeridos, y antes de salvarlos, transformamos el texto claro (por ejemplo, "patito 123") aplicando una función de hash como MD5 combinada con otros parámetros como el nombre de usuario y una "sal" del sistema.
Implementación de before save
para contraseñas
Aquí hay un ejemplo de cómo implementar el método before save
para manejar contraseñas:
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if ($insert) { // Nuevo usuario
$this->password = $this->ofuscatePassword($this->password);
}
return true;
} else {
return false;
}
}
protected function ofuscatePassword($password)
{
$salt = getenv("SALT");
if (empty($salt)) {
throw new Exception("noSalt");
}
return md5(sprintf('%s%s%s', $password, $this->username, $salt));
}
Ejecución y verificación desde línea de comandos
Para probar el manejo de usuarios y contraseñas, utilizamos un controlador en línea de comandos que nos permite crear y verificar usuarios. Así se logra que las contraseñas se almacenen de manera segura y se puedan validar correctamente:
public function actionNew($username, $password)
{
$user = new User();
$user->username = $username;
$user->password = $password;
if ($user->save()) {
printf("New user OK, ID: %d\n", $user->id);
} else {
printf("Problema creando usuario.\n");
}
}
public function actionCheck($username, $password)
{
$user = User::findOne(['username' => $username]);
if (!empty($user) && $user->password === $user->ofuscatePassword($password)) {
printf("Login válido\n");
} else {
printf("Nel\n");
}
}
Para verificar que la funcionalidad está implementada correctamente, se pueden ejecutar comandos como:
-
Crear un nuevo usuario:
php yii user/new "username" "password"
-
Comprobar el usuario:
php yii user/check "username" "password"
Beneficios de usar un sistema de hashing
El uso de un sistema de hashing para contraseñas ofrece grandes beneficios en términos de seguridad:
-
Protección de datos sensibles: Las contraseñas se almacenan como hashes, no como texto plano. Esto dificulta el acceso a las contraseñas originales por parte de intrusos.
-
Mayor seguridad con "sal": La "sal" añade un extra a la seguridad, haciendo que incluso contraseñas idénticas no generen el mismo hash en diferentes cuentas de usuario.
-
Integridad en las validaciones: Permite realizar validaciones confiables del lado del servidor asegurando que las credenciales coincidan correctamente con el hash almacenado.
Este enfoque otorga un nivel adicional de seguridad en el manejo de usuarios y contraseñas dentro de un sistema Yii, protegiendo efectivamente la información crítica.