Este post quizás es algo teórico, por lo que serviría para cualquier lenguaje (PHP, Java, ASP…), pero no habrá código para poder utilizar.
Se trata de hacer login en una aplicación mediante una cookie que estará almacenada en el navegador. Esto es lo que se suele hacer cuando queremos recordar al usuario y así que no tenga que logarse cada vez que entra o se pierde la sesión del navegador. Como se trata de una cookie le podemos poner la fecha de caducidad que queramos por lo que el usuario permanecerá logado durante ese tiempo.
Los datos en la cookie no pueden ir en claro, ya que cualquiera podría obtener esos datos si accedieran a nuestro navegador, por lo que hay que encriptarlos.
Supongamos que tenemos una tabla de usuarios que tiene como mínimo 3 datos: alias, contraseña y código. El alias y la contraseña están claro para que se usan y el código lo veremos más adelante. Contraseña y código serán ambos datos encriptados con MD5.
El proceso de login normal (mediante formulario) sería el siguiente: recibimos usuario y contraseña mediante POST y hacemos consulta a la BD para obtener los datos del usuario mediante el alias. Una vez obtenidos los datos del usuario, comprobamos si la contraseña de la BD y la contraseña recibida y encriptada con MD5 son la misma (nunca hay que recuperar los datos igualando el usuario y la contraseña, ya que si no se hace correctamente puede haber problemas de seguridad, por lo que es mejor obtener primero los datos y luego mediante código comparar los datos). Si las contraseñas coinciden daremos acceso a la aplicación, pero antes almacenaremos en el campo código un valor aleatorio y encriptado con MD5 que usaremos después.
Para realizar el login mediante cookies tendremos que guardar en la cookie el alias y la contraseña. Lo único que encriptaremos será la contraseña, el usuario también se podría encriptar, pero obtener los datos del usuario usando el alias encriptado es menos eficiente, tendría que realizar un MD5 por cada registro de la tabla de usuarios. También se podría almacenar en otro campo el alias encriptado, pero serían datos redundantes y tampoco es muy correcto.
La contraseña no se guardaría únicamente encriptada, ya que el MD5 se puede romper mediante fuerza bruta, por lo que lo que almacenaremos será una unión encriptada de una función simple entre la contraseña y el código. El ejemplo más sencillo para la función es la concatenación, por lo que la contraseña almacenada en la cookie quedaría algo así:
md5(contraseña+codigo)
que para ver un ejemplo más claro, si nuestra contraseña fuera ‘password‘, quedaría algo así:
md5( md5('password') + md5( rand() ) )
ya que la contrasñena en la BD se guarda encriptada y el código es un valor aleatorio encriptado.
Supongo que con mucha paciencia también se puede romper este código, pero realmente, si te preocupa que alguien pueda romper un MD5 de una cadena de 64 caracteres (32+32), mejor no hagas el recordar password y usa SSL.
Una vez obtenida la contraseña de la cookie, realizamos la operación con la contraseña obtenida en el consulta a la BD y si coinciden pues damos acceso a la aplicación.
Cada vez que se haga login se renueva el código y actualiza la cookie, y cada vez que se haga logout o se equivoque en el login se actualiza el código y se borra la cookie.
Esta es la forma en que lo haría yo, pero si alguien tiene dudas sobre la eficacia del método, por favor que lo comente.