Cambio password portal cautivo
-
Hola!
Antes de nada, me presento. Soy Jairo, trabajo como técnico informático en el ayuntamiento de mi pueblo.
Hace poco se nos ocurrió montar puntos de acceso gratuitos en algunos equipamientos municipales, y para tener un poco controlado el tema montamos un pfsense con un proxy y un portal cautivo que valida contra un freeradius, donde la gente tendrá que validarse con unas credenciales proporcionadas previamente en los puntos de información de estos equipamientos.
Todo funciona correctamente. Los passwords de freeradius se guardan en una BBDD MySQL y son creados a través de la utilidad DaloRadius usando el tipo de contraseña "Encrypted-password", que lo que hace es pasar la cadena de texto por la función ENCRYPT() de mysql.
El problema es que nos planteamos cómo un usuarios podía cambiar su password para ponerse uno personal, ya que los que damos son cadenas de caracteres aleatorias. Buscando por Internet encontré que lo mejor era hacer un mini-sitio web con php que atacase a la BBDD MySQL para modificar el password.
Bien, ya lo he construido. El problema es que para que funcione bien debo pedir el usuario y contraseña actuales, comprobarlos en la BBDD y seguidamente pedir el nuevo password. Como el password está cifrado en la BBDD pensé que pasando el password que me llegue por el formulario por la misma función ENCRYPT() saldría la misma cadena y podria comprovar si hacen match, pero he descubierto que aunque sea la misma palabra, la función ENCRYPT() siempre da una cadena diferente (a no ser que apliques siempre un mismo SALT).Todo este rollo lo explico para preguntar lo siguiente:
¿Sabéis qué consulta mysql o qué mecanismo utiliza el portal cautivo de pfSense para conseguir validar usuarios que tienen su password cifrado en la BBDD? Si el password es "abc", la función ENCRYPT me da cada vez una cosa distinta por lo tanto no concuerda con lo que hay en la BBDD, pero en cambio en el login del portal cautivo de pfSense siempre que le pones "abc" en el password comprueba en la BBDD la cadena cifrada y hace match.Qué opináis sobre el tema?
Espero haberme explicado bien.Muchas gracias de antemano!
Saludos! -
Creo que tienes cómo lo hace pfSense contra un Radius en https://github.com/pfsense/pfsense/blob/master/usr/local/captiveportal/radius_authentication.inc
-
Hola!
He encontrado una solución, pero de todos modos, gracias por tu ayuda Bellera. Me miraré ese código para entender mejor cómo maneja el portal cautivo.
La cosa es que descubrí que si a la función ENCRYPT le pasas la cadena a encriptar y como valor SALT le pasas el valor cifrado que hay actualmente en la base de datos ligado a ese username, si la función acaba devolviendo exactamente la misma cadena que el valor SALT que le has pasado quiere decir que la contraseña es correcta.
Además, como siempre le especificas un SALT, por mucho que aplicases repetidamente esa función a una misma cadena siempre devuelve el mismo valor cifrado, cosa que soluciona el problema que tenía al principio.Dejo la query mysql hecha con PHP y la clase PDO por si a alguien le sirve:
$sql = $conn->prepare('UPDATE radcheck SET value = ENCRYPT(:newPassword) WHERE username = :user AND value = ENCRYPT(:password, value)');
$sql->bindParam(":newPassword", $newPassword, PDO::PARAM_STR);
$sql->bindParam(":user", $user, PDO::PARAM_STR);
$sql->bindParam(":password", $password, PDO::PARAM_STR);Gracias.
Saludos!