¿Sabías que los servicios web seguros a los que te conectas con una contraseña en realidad no conocen la contraseña con la que te conectas? ¿Por qué se hace así? ¿Y cómo es posible? Armados con los conocimientos de nuestro artículo sobre Funciones Hash y Seguridad de la Información, podemos dar respuesta a estas preguntas.
Un procedimiento de inicio de sesión poco sofisticado
Veamos primero cómo sería un procedimiento de inicio de sesión poco sofisticado. Iniciamos sesión en un servicio web de la forma habitual, con un nombre de cuenta y una contraseña:
Nuestro poco sofisticado servicio web tiene una tabla en su base de datos con todos los nombres de cuenta y sus contraseñas asociadas:
En primer lugar, el servicio web busca en su base de datos el nombre de la cuenta que figura en el formulario de acceso cumplimentado. Si el nombre existe en la base de datos, el servicio también compara la contraseña del formulario de acceso con la contraseña asociada en la base de datos. Si las contraseñas coinciden, se realiza el registro. En caso contrario, se deniega el registro. A primera vista, se trata de un procedimiento de inicio de sesión seguro. Sólo aquellos que posean un nombre de cuenta válido y conozcan la contraseña asociada pueden acceder a la cuenta correspondiente. A todos los demás se les deniega el acceso. Hasta aquí, todo correcto. Pero, ¿qué tiene de poco sofisticado este procedimiento?
El problema es que las contraseñas se almacenan en una base de datos. Esto significa que son potencialmente conocidas por cualquiera que tenga acceso a la base de datos, incluidos los operadores del servicio web y sus empleados. Además, hoy en día es habitual que muchas empresas subcontraten el funcionamiento real de los servicios web que ofrecen a proveedores estadounidenses de computación en nube, como Amazon Web Services o Google Cloud. Por lo tanto, podemos suponer que, en principio, los operadores y empleados de estos proveedores de computación en nube también tienen acceso a la base de datos y, por lo tanto, a nuestra contraseña. Además, por supuesto, los delincuentes también podrían obtener acceso no autorizado a los datos de la base de datos.
Por otra parte, no es ningún secreto que la mayoría de los usuarios de servicios web reutilizan la misma contraseña para varios servicios. Por lo tanto, quien haya conseguido la contraseña de la cuenta de Facebook/Twitter o de la agencia de viajes en línea de un objetivo, con un poco de suerte también tendrá la contraseña de su correo electrónico, de su banca en línea, de su organizador personal, de una plataforma de citas y de la intranet de la empresa en la que trabaja el objetivo. El incentivo económico para robar contraseñas de la base de datos de cualquier servicio web es, por tanto, elevado, incluso si el servicio web en sí no es un objetivo lucrativo. La pregunta es: ¿cómo resolver este problema?
Un procedimiento de inicio de sesión más sofisticado
Recordemos: El servicio web descrito anteriormente tiene una tabla en su base de datos con todos los nombres de cuenta y las contraseñas asociadas:
Adaptamos esta tabla de la siguiente manera. En lugar de almacenar las contraseñas, les aplicamos una función hash criptográfica de nuestra elección:
Lo que es una función hash criptográfica, ha sido descrito en el artículo sobre Funciones Hash y Seguridad de la Información. Entonces, en lugar de las contraseñas, almacenamos los valores hash resultantes en la base de datos:
Esto sólo cambia ligeramente el procedimiento de inicio de sesión. Seguimos iniciando sesión de la forma habitual con un nombre de cuenta y una contraseña:
En primer lugar, el servicio web vuelve a buscar en su base de datos el nombre de cuenta del formulario de inicio de sesión cumplimentado. Pero en el siguiente paso, el nuevo procedimiento difiere. Si el nombre existe en la base de datos, la función hash se aplica a la contraseña de la pantalla de inicio de sesión. Sólo entonces se compara el valor hash resultante con el valor hash correspondiente en la base de datos. Una vez más, las contraseñas ya no se comparan entre sí, sino sólo con sus valores hash. Si los valores hash coinciden, se inicia la sesión. En caso contrario, se deniega el inicio de sesión.
Aparte del uso de la función hash, nada ha cambiado en el procedimiento de inicio de sesión. De las propiedades de las funciones hash criptográficas se deduce que comparar los valores hash es tan bueno como comparar directamente las contraseñas. Pero ahora, las propias contraseñas ya no se almacenan en la base de datos del servicio web. Cualquiera que acceda a la base de datos -autorizado o no- ya no tiene acceso a las contraseñas, sino sólo a sus valores hash. El incentivo económico descrito anteriormente para robar las contraseñas de la base de datos de un servicio web desaparece porque las contraseñas ya no se encuentran en la base de datos.
¿Cómo funciona esto en la práctica?
Esperamos haber podido explicar mejor cómo es posible y por qué es práctica habitual que los servicios web seguros ni siquiera conozcan las contraseñas que utilizamos al iniciar sesión. En la práctica, la seguridad de este procedimiento se incrementa aún más generando los valores hash con una función hash criptográfica especializada (bcrypt) y vinculándolos además con una cadena de caracteres secretos (salt) para toda la base de datos antes de aplicar esta función hash. Sin embargo, no queremos entrar en esto en este momento.
¿Ha olvidado su contraseña?
Si ha olvidado su contraseña para un servicio web, puede solicitar un restablecimiento de contraseña en la mayoría de los servicios web. Recibirá un correo electrónico con un enlace que le llevará a un formulario donde podrá establecer una nueva contraseña. Ahora sabemos por qué esto se maneja de forma tan incómoda: el servicio web no conoce tu antigua contraseña. Por desgracia, aún no todas las empresas siguen esta práctica de seguridad establecida. Si indicas por correo electrónico o en una llamada telefónica con un equipo de soporte que has olvidado tu contraseña y luego realmente te la dicen, puedes concluir que esta empresa no se adhiere a las normas modernas de seguridad de la información. Como muy tarde, debería asegurarse de no utilizar esta contraseña en ningún otro contexto. Para utilizar sistemáticamente una contraseña distinta para cada servicio web, debería utilizar un gestor de contraseñas. De este modo, ya no tendrás que recordar un montón de contraseñas individuales y podrás crear contraseñas aleatorias de alta calidad. Existen complementos para los navegadores de los gestores de contraseñas más conocidos que incluso rellenan las pantallas de inicio de sesión de los servicios web por ti. Pocas veces la comodidad y la seguridad se combinan tan bien.