7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Web Development

Gestión segura de las credenciales de inicio de sesión del usuario

Scroll to top
Read Time: 15 mins

Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)

Dentro de la mayoría de los sitios web tienes diferentes áreas (la página de inicio, el perfil del usuario, la página del administrador, etc.), algunas de las cuales serán públicas y otras tendrán que restringirse solamente a ciertos usuarios. A menudo querrás identificar a los usuarios de forma única para poder brindar contenido personalizado o para capturar información específica de un usuario. Muchos sitios también necesitan proteger parte de sí mismos, por ejemplo un área administrativa para actualizar y dar mantenimiento al contenido. En un sitio CMS algunos usuarios pueden crear contenido, pero otros deben aprobar dicho contenido antes de mostrarlo al público.

Protegiendo el nombre de usuario y la contraseña

Sea cual sea la necesidad, la restricción o la personalización, se necesita identificar a cada usuario que accede a tu sitio. Para un sitio orientado a Internet destinado a usuarios generales, el nombre de usuario y la contraseña aún prevalecen en gran medida debido a que no hay una mejor opción. Hay otras opciones si estás trabajando en ambientes especiales, tales como la Intranet de una compañía, en donde tienes cierto control sobre los visitantes del sitio.

Aunque son una necesidad común, los inicios de sesión y las contraseñas a menudo se gestionan de una manera que deja al sitio web y a sus usuarios más vulnerables a ataques de seguridad de forma innecesaria. Al seguir algunas prácticas recomendables, puedes proteger mejor a tu sitio y su contenido de los piratas informáticos. Las consecuencias de una protección deficiente pueden ser graves. Imagina un sitio en el que cualquier usuario pudiera publicar contenido que pareciera provenir de la compañía debido a un manejo de contraseñas deficiente, o imagina una tienda en línea en la que cualquier usuario pudiera ver todos los pedidos realizados en el sitio.

Echemos un vistazo a algunas consideraciones de seguridad al trabajar con inicios de sesión y contraseñas en tus sitios web.

Nombres de usuario: correos electrónicos o genéricos

El inicio de sesión está compuesto por un nombre de usuario que te identifica, y una contraseña que valida que tú eres el usuario que dices ser. Los sitios web a menudo permiten al usuario especificar ya sea un nombre de usuario personalizado o bien usar su dirección de correo electrónico como su nombre de usuario.

Ventajas

Los correos electrónicos no cambian frecuentemente y la mayoría de los sitios web ya recopilan esta información, así que será menos probable que el usuario olvide su correo electrónico en comparación con un nombre de usuario que haya creado. El correo electrónico será único automáticamente, ya que los usuarios rara vez comparten una cuenta de correo, y aquellos que lo hacen probablemente no querrán cuentas separadas.

Desventajas

Entre las desventajas de un correo electrónico se encuentra el hecho de que dos personas que comparten un correo electrónico no pueden tener cuentas separadas. Además, si tu sitio tiene una razón legítima para que una persona tenga múltiples cuentas, quizá esto no sea posible con el uso de correos electrónicos, pero sería más sencillo de implementar usando nombres de usuarios. También es probable que un correo electrónico sea más fácil de hackear, ya que un usuario probablemente emplea el mismo correo en todos los sitios, pero la mayoría de los nombres de usuario probablemente no sean mucho más difíciles de hackear, ya que los usuarios tienden a reutilizar estos nombres con la misma frecuencia con la que reutilizan las contraseñas.

A menos que tengas una razón específica para evitar una dirección de correo electrónico, dale preferencia al correo como nombre de usuario para el inicio de sesión. El uso del correo electrónico también se ha convertido en la norma en los sitios web. Sin embargo, no olvides proporcionar un inicio de sesión basado en correos electrónicos con una manera para cambiar la dirección de correo. Sin esta herramienta, un usuario necesitaría crear una nueva cuenta y perdería todo su historial simplemente por cambiar a otro proveedor de Internet o perdería una cuenta anterior debido a su graduación o a algún cambio de trabajo, lo que causaría que su correo electrónico antiguo desapareciera.

Al usar el correo electrónico como inicio de sesión, siempre ten cuidado de no mostrarlo públicamente por razones de privacidad y para prevenir problemas con correo no deseado.

Los inicios de sesión pueden proporcionar demasiada información

La página de inicio de sesión de tu sitio web será el primer punto de investigación para un pirata informático. Éste intentará determinar cuentas válidas que existen en un sitio web. Administrar adecuadamente la página de inicio de sesión hará que el trabajo del pirata informático sea más difícil. Para empezar, debes minimizar la cantidad de datos que un inicio de sesión fallido puede proporcionar a un atacante. Tu pensamiento inicial cuando alguien ingresa un nombre de usuario que no es reconocido debería ser proporcionar un mensaje útil que le indique a esa persona que debe de verificar su nombre de usuario. Puedes proporcionar una página más segura mostrando el mismo mensaje de error cuando el nombre de usuario no haya sido encontrado y cuando la contraseña no coincida con aquella que pertenece a un usuario dado. El mensaje debe indicar que la combinación de nombre de usuario y contraseña no fue la correcta, para así indicarle al usuario que debe verificar ambas partes de la información, no solamente una o la otra.

Si tu sitio usa correos electrónicos para el nombre de usuario durante el inicio de sesión, un atacante fácilmente puede validar si un usuario tiene una cuenta en tu servicio si devuelves un mensaje diferente para un inicio de sesión desconocido, en comparación con una combinación de nombre de usuario y contraseña equivocados. Esto vuelve las cosas un poco menos convenientes  para el usuario, pero la seguridad añadida normalmente es una mejor compensación.

Como se mencionó, eliminar el mensaje específico para un nombre de usuario no válido proporciona una mayor seguridad, pero a cambio ocasiona una peor experiencia para el usuario. Proporcionar un mensaje indicando que un inicio de sesión no existe ayudará al usuario a darse cuenta de errores tipográficos, como escribir john en vez de jon más fácilmente. Ese mensaje también ayuda a un usuario que no recuerde cuál nombre de usuario empleó en tu sitio. Ten en mente que estos tipos de mensajes le proporcionan a los piratas informáticos una manera simple y sencilla de verificar si un usuario existe en tu sitio.

También puedes ayudar a frustrar a un pirata informático gestionando mejor los múltiples intentos de inicio de sesión. Escribir incorrectamente un nombre de usuario o contraseña por accidente más de una vez es algo bastante común debido a un carácter mal escrito, por la transposición de dos caracteres o al usar la contraseña de otro sitio en vez de la correcta. Permitir un número ilimitado de intentos de inicio de sesión le abre la puerta a un ataque por fuerza bruta intentando con nombres de usuario y contraseñas repetidamente para determinar el inicio de sesión correcto. Las herramientas automatizadas y la secuencias de comandos aceleran el proceso, permitiendo que un pirata informático trabaje metódicamente a través de muchas contraseñas potenciales hasta encontrar el inicio de sesión correcto.

Introducir un tiempo de retardo cada vez mayor después de cada intento de inicio de sesión fallido también ayuda a frustrar a los piratas informáticos. El primer intento de inicio de sesión ocurre de forma normal. El segundo inicio de sesión se retrasa una fracción de segundo antes de devolver el resultado. Los intentos adicionales se retrasan cada vez más antes de devolver una respuesta. Este retraso permite una interrupción mínima para un usuario legítimo que haya cometido un error, pero ralentiza a un pirata informático que intente un ataque por fuerza bruta en el sitio.

Para datos más confidenciales es posible adoptar un enfoque más sólido bloqueando la cuenta después de una cantidad determinada de intentos fallidos. El bloqueo de la cuenta la deshabilita ya sea temporal o permanentemente. El bloqueo detiene los ataques por fuerza bruta ya que, pasado un punto, el inicio de sesión no funcionará. Una desactivación temporal tendría un efecto mínimo en el usuario, siempre y cuando se muestre un mensaje que indique el motivo del bloqueo. Un bloqueo permanente requiere que el usuario se ponga en contacto con soporte para solucionar el problema y se ajusta mejor a los inicios de sesión, protegiendo datos importantes.

Asegurando las contraseñas

Las contraseñas son el aspecto más sensible del inicio de sesión. Nunca almacenes contraseñas en texto sin formato. Nunca. Jamás. Hacer eso significaría que casi cualquier problema de seguridad podría exponer información de inicio de sesión. Incluso las contraseñas encriptadas deben evitarse, ya que si el pirata informático obtiene acceso a los datos encriptados, el proceso de descrifrado puede ser mucho más sencillo. Cualquier medio de almacenamiento en el que puedas recuperar una contraseña permite que un pirata informático haga lo mismo de forma más sencilla.

Agregando sal y usando funciones hash

Las contraseñas deberían ser almacenadas con sal y usando funciones hash. La sal es un valor único y generado aleatoriamente que se almacena para cada inicio de sesión y se añade antes de utilizar funciones hash. Añadir la sal evita que contraseñas idénticas tengan el mismo resultado hash y evita que un pirata informático construya una lista del resultado hash de posibles combinaciones de contraseñas por adelantado. Añadiendo el hash aleatorio, una contraseña del tipo abc123 (por favor, nunca uses algo así como una contraseña real) dará un resultado hash diferente para cada usuario.

Una función hash convierte una contraseña en un valor de longitud fija. Hay funciones específicamente diseñadas para contraseñas, tales como PBKDF2 o Bcrypt. Los procesadores GPU en las tarjetas gráficas modernas pueden llevar a cabo los cálculos necesarios para el hash y pueden quebrantar muchos algoritmos débiles rápidamente. Las computadoras dedicadas que tienen el propósito de descifrar contraseñas pueden determinar cualquier contraseña de ocho caracteres o menos, en menos de seis horas.

Los usuarios a menudo tienden a reutilizar la misma contraseña para la mayoría de los siitos en los que tienen cuentas. Muchos sitios han comenzado a comparar las credenciales expuestas causadas por los principales hackeos de cuentas de inicio de sesión con sus propios inicios de sesión y se han puesto en contacto con los usuarios cuyas combinaciones de nombres de usuario y contraseñas coinciden. Evernote y Facebook recientemente examinaron las credenciales de inicio de sesión liberadas por Adobe y alertaron a los usuarios que estaban usando esas mismas credenciales.

La manera más sencilla de gestionar contraseñas correctamente es usar las herramientas incluidas en tu framework web. La seguridad de las contraseñas es complicada y equivocarte tan solo una vez puede dejar las contraseñas de tus usuarios abiertas a ataques. pH pass proporcionar una biblioteca de dominio público para PHP usando Bcrypt. Los proveedores de membresías anteriores integrados en .NET usaban hashes más débiles, pero los nuevos Proveedores Universales usan PBKDF2. Rails también proporciona una gema Bcrypt.

Restableciendo contraseñas

Cuando proteges las contraseñas adecuadamente, de manera que no puedan ser recuperadas, pierdes la capacidad de proporcionarle al usuario una contraseña que haya olvidado. Siendo así, necesitas proporcionar una manera alternativa y segura para restablecer la contraseña que un usuario haya olvidado de forma legítima.

La página para restablecer contraseñas

Una buena página para restablecer contraseñas permite al usuario cambiar la contraseña sin conocer la actual. El método tradicional permite que el usuario introduzca su dirección de correo electrónico y luego envía un vínculo a una página web que le permite restablecer la contraseña. Enviar un vínculo es más seguro que enviar una contraseña, ya que la nueva contraseña no es creada sino hasta que el usuario accede a la página. Enviar una nueva contraseña por correo electrónico crearía una nueva credencial que cualquier persona que intercepte el correo podría usar sin el conocimiento del usuario. Si alguien intercepta el correo electrónico y restablece la contraseña, el usuario sabrá cuándo accedió e intentó restablecer su contraseña.

Una buena página para restablecer contraseñas tampoco debe proporcionar la validación de que una cuenta existe. La lógica es la misma que discutimos con respecto a no proporcionar retroalimentación si una cuenta no existe al iniciar sesión. Incluso si el inicio de sesión no existe en el sistema. El mejor enfoque es proporcionar un mensaje que indique que las instrucciones han sido enviadas a la dirección de correo electrónico registrada. Aún debes enviar un correo electrónico a la dirección ingresada, ya que puede ser un caso legítimo de haber olvidado qué correo electrónico fue usado para una cuenta, por ejemplo al ingresar un correo electrónico de trabajo en vez de uno personal.

Vínculos para restablecer contraseñas

El vínculo para restablecer contraseñas debe estar diseñado de manera que la solicitud de restablecimiento tenga una vida útil limitada y que solamente pueda usarse una vez. Crea un token único para cada solicitud de restablecimiento que esté vinculado a la cuenta solicitada y almacénalo en una base de datos. Este token se convierte en parte de la dirección URL enviada por correo para restablecer la contraseña. También debes asignar al token un tiempo de vencimiento y eliminarlo después de que el proceso de restablecimiento haya sido completado. Si alguien intenta usar un token vencido o que ya haya sido usado, la solicitud fallaría. El tiempo de vencimiento debe ser lo suficientemente largo como para permitir que el correo electrónico sea recibido y para que el usuario finalice la acción, pero no tan largo como para permitir su uso en un futuro demasiado lejano. Un marco de tiempo de unas cuantas horas usualmente será suficiente.

Restableciendo una contraseña a través del correo electrónico

Restablecer una contraseña usando un correo electrónico también ocasiona que la seguridad de tu sitio sea dependiente de la integridad del correo del usuario. Si es posible para alguien acceder al correo electrónico, entonces esa persona puede restablecer la contraseña. Los sitios pueden añadir preguntas de seguridad que deben ser respondidas antes de restablecer la contraseña. Las preguntas de seguridad proporcionan muy poca seguridad adicional si las respuestas son fáciles de encontrar. Una pregunta de seguridad del tipo "¿Cuál es mi ciudad natal?" proporciona muy poca seguridad si la respuesta puede obtenerse a través del perfil de Facebook de la persona. Para obtener más información sobre cómo desarrollar buenas preguntas, consulta http://goodsecurityquestions.com/.

Autenticación de dos pasos

Un inicio de sesión y una contraseña requieren solamente un par de datos para acceder a un sitio web. Cuando se proporciona esa información, entonces se asume que el usuario es la persona correcta. Para que el robo de credenciales sea menos efectivo, puedes añadir un segundo paso al proceso de autenticación. Además de algo que el usuario sepa (el nombre de usuario y la contraseña), éste también debe usar algo que tenga en su posesión actualmente, por lo general un teléfono celular a través de SMS o una aplicación para este propósito.

Probablemente los bancos fueron los primeros en implementar este proceso usando hardware personalizado para generar un código dependiente de la hora. Google popularizó el uso de mensajes de texto SMS o de una aplicación como segundo paso. Ahora muchos sitios usan un inicio de sesión compatible con la implementación de Google de RFC 6238. Puedes encontrar bibliotecas que ya implementan esta técnica para los frameworks más populares, tales como ASP.NETASP.NET #2Ruby on RailsPHP y Django.

Autenticación externa

Para evitar estos problemas tienes otra opción, que es dejar que alguien más se encargue de todo esto haciendo una integración con terceros para llevar a cabo la autenticación, por ejemplo Twitter, Facebook u OpenID. Hacer esto proporciona beneficios y desventajas. Elimina la mayoría de las preocupaciones de seguridad que hemos discutido aquí, ya que alguien más gestiona estos problemas. Sin embargo, estos otros sitios probablemente también son un blanco de ataque más grande que tú para los piratas informáticos. Si usas otro sitio para gestionar la autenticación, entonces, si ese inicio de sesión se ve comprometido, los piratas informáticos tendrán acceso a tu sitio.

El uso de un servicio de terceros conocido puede ser útil y perjudicial desde el punto de vista social y de tu reputación. La ventaja de permitir el inicio de sesión ya sea con Facebook o Twitter es que muchos usuarios ya tienen cuentas en esos sitios y ellos estarán felices de usarlas. Otros visitantes podrían ver la integración con estos sitios como una característica negativa y evitar el uso de tu sitio debido a ello o si se trata de la única opción que se les proporciona.

Conclusión

El inicio de sesión de tu aplicación web juega un papel vital en la seguridad de tu sitio. Tomar las medidas necesarias para proteger tu inicio de sesión logrará mucho para el cuidado de tu sitio, los usuarios del mismo así como la información privada de estos últimos. Para trabajar de forma segura con inicios de sesión, minimiza la cantidad de datos que las páginas de restablecimiento de tu inicio de sesión y contraseña pueden proporcionar a un pirata informático. Además, implementa medidas de seguridad para lograr que sea más difícil adivinar las contraseñas de tu usuario a través de fuerza bruta.

La protección de contraseñas es una preocupación fundamental para cualquier sitio. Las contraseñas mal protegidas vuelven más sencillo el trabajo del pirata informático y pueden ocasionar que las credenciales de inicio de sesión de tu sitio sean expuestas al público. El uso de contraseñas con sal y funciones hash vuelven mucho más difícil el trabajo del pirata informático. Además, agregar la opción de un segundo paso al proceso de inicio de sesión puede proporcionar más protección para los usuarios de tu sitio. También puedes elegir utilizar un servicio de terceros para gestionar los inicios de sesión de tu sitio.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.