Verá, el mundo de las contraseñas olvidadas es bastante misterioso. Hay muchos puntos de vista diferentes, perfectamente aceptables y muchos bastante peligrosos. Es probable que se haya encontrado con cada uno de ellos muchas veces como usuario final; así que intentaré usar estos ejemplos para mostrar quién está haciendo las cosas bien y quién no, y en qué enfocarme para implementar correctamente la función en su aplicación.
Almacenamiento de contraseña: hash, cifrado y (¡oh!) Texto sin formato
No podemos discutir qué hacer con las contraseñas olvidadas antes de discutir cómo almacenarlas. En la base de datos, las contraseñas se almacenan en uno de tres tipos principales:
- Texto simple. Hay una columna de contraseña, que se almacena en texto sin formato.
- . ( ), .
- . ( , ); , , , .
Vamos a aclararlo con la pregunta más simple: ¡ nunca almacene las contraseñas en texto plano! Nunca. Una sola vulnerabilidad de inyección , una copia de seguridad realizada inadvertidamente o uno de docenas de otros errores simples, y eso es todo, jugador, todas sus contraseñas, es decir, lo siento, todas las contraseñas de sus clientes pasarán a ser de dominio público. Por supuesto, esto significará una gran posibilidad de que todas sus contraseñas de todas sus cuentas en otros sistemas se conviertan en dominio público . Y eso será tu culpa.
El cifrado es mejor, pero tiene sus debilidades. El problema con el cifrado es el descifrado; puede tomar estos cifrados de aspecto loco y convertirlos de nuevo a texto sin formato, y cuando eso suceda, volveremos a la situación con contraseñas legibles. ¿Como sucedió esto? Un pequeño defecto penetra en el código que descifra la contraseña, haciéndola disponible públicamente; esta es una forma. Los piratas informáticos obtienen acceso a la máquina en la que se almacenan los datos cifrados; este es el segundo método. Otra forma, nuevamente, es robar la copia de seguridad de la base de datos, y alguien también obtiene la clave de cifrado, que a menudo se almacena de manera muy insegura.
Y eso nos lleva al hash. La idea detrás del hash es que se hace de una manera; la única forma de comparar la contraseña ingresada por el usuario con su versión hash es hash de la contraseña ingresada y compararlas. Para evitar ataques con herramientas como tablas de arco iris, usamos sal para agregar aleatoriedad al proceso (lea mi publicación sobre almacenamiento criptográfico para obtener una imagen completa ). En última instancia, si se implementa correctamente, podemos asumir con confianza que las contraseñas hash nunca volverán a ser texto sin formato (hablaré sobre los beneficios de varios algoritmos hash en otra publicación).
Un argumento rápido sobre el hash y el cifrado: la única razón por la que necesitará cifrar una contraseña en lugar de hacerlo es cuando necesite ver la contraseña en texto sin formato, y nunca debería querer hacerlo , al menos en una situación estándar. sitio web. Si lo necesita, lo más probable es que esté haciendo algo mal.
¡Atención!
A continuación, en el texto de la publicación, se encuentra una parte de la captura de pantalla del sitio web pornográfico AlotPorn. Está cuidadosamente recortado, por lo que no hay nada que no se pueda ver en la playa, pero si aún puede causar algunos problemas, no se desplace hacia abajo en la página.
Restablezca siempre su contraseña, nunca la recuerde
¿Alguna vez le han pedido que cree una función de recordatorio de contraseña? Dé un paso atrás y piense en esta solicitud a la inversa: ¿por qué es necesario este "recordatorio"? Porque el usuario ha olvidado la contraseña. ¿Qué queremos hacer realmente? Ayúdalo a iniciar sesión de nuevo.
Entiendo que la palabra "recordatorio" se usa (a menudo) de manera coloquial, pero lo que realmente estamos tratando de hacer es ayudar de manera segura al usuario a estar en línea nuevamente . Dado que necesitamos seguridad, hay dos razones por las que un recordatorio (es decir, enviar al usuario su contraseña) no es apropiado:
- — . , HTTP ( HTTPS), , . , , , , , , , . — .
- . — ( ), .
Permítanme ilustrar el problema con usoutdoor.com como ejemplo : Aquí hay una página de inicio de sesión típica:

Obviamente, el primer problema es que la página de inicio de sesión no se carga a través de HTTPS, pero el sitio también ofrece enviar una contraseña ("Enviar contraseña"). Este podría ser un ejemplo del uso coloquial del término mencionado anteriormente, así que vayamos un paso más allá y veamos qué sucede:

Desafortunadamente, no se ve mucho mejor; y el correo electrónico confirma el problema:

Esto nos dice dos aspectos importantes de usoutdoor.com:
- El sitio no utiliza hash en las contraseñas. En el mejor de los casos, están cifrados, pero es probable que estén almacenados en texto sin formato; no vemos evidencia de lo contrario.
- El sitio envía una contraseña a largo plazo (podemos volver atrás y usarla una y otra vez) a través de un canal no seguro.
Con esto en mente, debemos verificar si el proceso de reinicio se está realizando de manera segura. El primer paso para hacer esto es asegurarse de que el solicitante tenga derecho a realizar el restablecimiento. En otras palabras, antes de eso, necesitamos una verificación de identidad; Echemos un vistazo a lo que sucede cuando se verifica una identidad sin verificar primero que el solicitante es realmente el propietario de la cuenta.
Listado de nombres de usuario y su impacto en el anonimato
Este problema se ilustra mejor visualmente. Problema:

¿Ver? Preste atención al mensaje "No hay ningún usuario registrado con esta dirección de correo electrónico" ("El usuario con esta dirección de correo electrónico no está registrado"). El problema surge obviamente si dicho sitio confirma la existencia de un usuario registrado con dicha dirección de correo electrónico. Bingo - ¡Acabas de descubrir el fetiche pornográfico de tu esposo / jefe / vecino!
Por supuesto, la pornografía es un ejemplo bastante canónico de la importancia de la privacidad, pero el peligro de asociar a una persona con un sitio web en particular es mucho más amplio que la situación potencialmente embarazosa descrita anteriormente. Uno de los peligros es la ingeniería social; si un atacante puede relacionar a una persona con un servicio, entonces tendrá información que podrá comenzar a usar. Por ejemplo, podría ponerse en contacto con una persona que se hace pasar por el portavoz de un sitio web y pedirle más información en un intento de phishing .
Prácticas como esta también introducen el peligro de la “enumeración de nombres de usuario”, mediante el cual puede verificar que existe una colección completa de nombres de usuario o direcciones de correo electrónico en un sitio web mediante simples consultas grupales y examinando las respuestas. ¿Tiene una lista de las direcciones de correo electrónico de todos los empleados y unos minutos para escribir un guión? ¡Entonces ves cuál es el problema!
Cual es la alternativa? De hecho, es bastante simple y está bien implementado en Entropay :

Aquí Entropay no revela en absoluto sobre la existencia de una dirección de correo electrónico en su sistema a nadie que no sea el propietario de la dirección de correo electrónico . Si posee esta dirección y no existe en el sistema, recibirá un correo electrónico como este:

Por supuesto, hay situaciones aceptables en las que alguien cree que se ha registrado en el sitio web. pero no lo es, o lo hizo desde una dirección de correo diferente. El ejemplo que se muestra arriba maneja bien ambas situaciones. Obviamente, si la dirección coincide, recibirá un correo electrónico para facilitar el restablecimiento de su contraseña.
La sutileza de la solución Entropay es que la verificación de identidad se realiza por correo electrónico antes de cualquier verificación en línea. Algunos sitios piden a los usuarios una pregunta secreta (más sobre eso a continuación) antescómo puede comenzar el reinicio; sin embargo, el problema con esto es que debe responder la pregunta mientras proporciona algún tipo de identificación (correo electrónico o nombre de usuario), lo que hace que sea casi imposible responder de forma intuitiva sin revelar la existencia de una cuenta de usuario anónimo.
Hay una ligera disminución en la usabilidad con este enfoque , porque no hay comentarios instantáneos en caso de un intento de restablecer una cuenta que no existe. Por supuesto, este es el objetivo de enviar un correo electrónico, pero desde el punto de vista de un usuario final real, si ingresa la dirección incorrecta, primero se entera de ella solo cuando recibe el correo electrónico. Esto puede causar cierta tensión de su parte, pero es un pequeño precio a pagar por un proceso tan raro.
Otra nota al margen, un poco fuera de tema, las funciones de ayuda de inicio de sesión que revelan el nombre de usuario o la dirección de correo electrónico correctos tienen el mismo problema. Responda siempre al usuario con un mensaje "Su combinación de nombre de usuario y contraseña no es válida", en lugar de confirmar explícitamente la existencia de credenciales (por ejemplo, "el nombre de usuario es correcto, pero la contraseña se ingresó incorrectamente").
Enviar una contraseña de restablecimiento versus enviar una URL de restablecimiento
El siguiente concepto que debemos discutir está relacionado con la forma de restablecer una contraseña. Hay dos soluciones populares:
- Generar una nueva contraseña en el servidor y enviarla por correo electrónico
- Envíe un correo electrónico con una URL única para simplificar el proceso de restablecimiento
A pesar de los muchos tutoriales , el primer punto nunca debe usarse. Su problema es que significa que hay una contraseña almacenada que se puede devolver y reutilizar en cualquier momento; se transmitió a través de un canal no seguro y permanece en su bandeja de entrada. Lo más probable es que las bandejas de entrada estén sincronizadas con los dispositivos móviles y el cliente de correo electrónico, además de que se pueden almacenar en línea en el servicio de correo electrónico web durante mucho tiempo. El caso es que el buzón no puede considerarse un medio fiable para el almacenamiento a largo plazo .
Pero además de esto, el primer punto tiene otro problema serio: simplifica tanto como sea posiblebloquear la cuenta con intenciones maliciosas. Si conozco la dirección de correo electrónico de la persona propietaria de la cuenta en el sitio web, puedo bloquearlo en cualquier momento simplemente restableciendo su contraseña; ¡Este es un ataque de denegación de servicio, presentado en bandeja de plata! Es por eso que el restablecimiento debe realizarse solo después de una verificación exitosa con el solicitante del derecho al mismo.
Cuando hablamos de una URL de restablecimiento, nos referimos a una dirección de sitio web que es única para esa instancia particular del proceso de restablecimiento . Por supuesto, debería ser aleatorio, no debería ser fácil de adivinar y no debería contener ningún enlace de cuenta externa para facilitar el restablecimiento. Por ejemplo, la URL de restablecimiento no debería ser solo una ruta como "Reset /? Username = JohnSmith".
Queremos crear un token único que se pueda enviar por correo electrónico como una URL de restablecimiento y luego se verifique con un registro del servidor en la cuenta de usuario, confirmando así que el propietario de la cuenta es la misma persona que está tratando de restablecer la contraseña. ... Por ejemplo, un token puede tener el formato "3ce7854015cd38c862cb9e14a1ae552b" y se almacena en la tabla junto con el ID de usuario del usuario que se restablece y la hora en que se generó el token (más sobre esto a continuación). Al enviar un correo electrónico contiene una URL como "Reset /? Id = 3ce7854015cd38c862cb9e14a1ae552b", y cuando el usuario lo carga, la página solicita la existencia del token, luego de lo cual confirma la información del usuario y permite cambiar la contraseña.
Por supuesto, dado que el proceso anterior (con suerte) permite al usuario crear una nueva contraseña, asegúrese de que la URL se cargue a través de HTTPS. No, no basta con enviarlo con una solicitud POST sobre HTTPS , esta URL con el token debe usar la seguridad de la capa de transporte para que sea imposible realizar un ataque MITM en el formulario de nueva contraseña y la contraseña creada por el usuario se transmita a través de una conexión segura.
Además, para la URL de restablecimiento, debe agregar un límite de tiempo de token para que el proceso de restablecimiento se pueda realizar dentro de un cierto intervalo, por ejemplo, dentro de una hora. Esto asegura que la ventana de restablecimiento sea mínima para que el destinatario de esta URL de restablecimiento solo pueda actuar dentro de esta ventana muy pequeña. Por supuesto, el atacante puede iniciar el proceso de reinicio nuevamente, pero deberá obtener otra URL de reinicio única.
Finalmente, necesitamos hacer este proceso de una sola vez. Una vez que se completa el proceso de restablecimiento, se debe eliminar el token para que la URL de restablecimiento ya no sea funcional. El punto anterior es necesario para que el atacante tenga una ventana muy pequeña durante la cual pueda manipular la URL de restablecimiento. Además, por supuesto, después de un reinicio exitoso, el token ya no es necesario.
Algunos de estos pasos pueden parecer excesivamente redundantes, pero no interfieren en absoluto con la usabilidad y en realidad aumentan la seguridad, aunque en situaciones que esperamos sean raras. En el 99% de los casos, el usuario iniciará el restablecimiento en un período de tiempo muy corto y no restablecerá la contraseña nuevamente en un futuro próximo.
Papel de CAPTCHA
¡Oh, CAPTCHA, el remedio que todos amamos odiar! De hecho, CAPTCHA no significa tanto protección como identificación: usted es un humano o un robot (o un script automatizado). Su propósito es evitar el envío automático de formularios, que, por supuesto, puede utilizarse como un intento de violar la seguridad. En el contexto del restablecimiento de contraseñas, CAPTCHA significa que la función de restablecimiento no se puede descifrar por la fuerza bruta para enviar spam al usuario o intentar determinar la existencia de cuentas (lo que, por supuesto, no será posible si siguió los consejos de la sección sobre verificación de identidad).
Por supuesto, el CAPTCHA en sí no es ideal; Hay muchos precedentes de "piratería" de su software y de lograr suficientes tasas de éxito (60-70%). Además, hay una solución que se muestra en mi publicación sobre la piratería de CAPTCHA con personas automatizadas donde puede pagar a las personas una fracción de centavo para resolver cada CAPTCHA y obtener una tasa de éxito del 94%. Es decir, es vulnerable, pero (levemente) eleva la barrera de entrada.
Echemos un vistazo a un ejemplo de PayPal:

En este caso, el proceso de reinicio simplemente no puede comenzar antes de que se resuelva el CAPTCHA, por lo que teóricamente es imposible automatizar el proceso. En teoria.
Sin embargo, para la mayoría de las aplicaciones web, esto será excesivo y definitivamente una disminución en la usabilidad: ¡a la gente simplemente no le gustan los CAPTCHA! Además, un CAPTCHA es algo que puede revisarse fácilmente cuando sea necesario. Si el servicio comienza a ser atacado (el registro es útil aquí, pero más sobre eso más adelante), entonces agregar un CAPTCHA no es más fácil.
Preguntas y respuestas secretas
Con todos los métodos que analizamos, pudimos restablecer la contraseña con solo tener acceso a una cuenta de correo electrónico. Digo "solo", pero por supuesto, tener acceso ilegal a la cuenta de correo de otra persona debe ser difícil. Sin embargo, este no es siempre el caso .
De hecho, el enlace de arriba sobre cómo hackear el Yahoo! tiene dos propósitos; En primer lugar, ilustra lo fácil que es piratear (algunas) cuentas de correo electrónico y, en segundo lugar, muestra cómo las malas preguntas de seguridad pueden utilizarse de forma maliciosa. Pero volveremos a esto más tarde.
El problema de restablecer contraseñas que depende en un 100% del correo electrónico es que la integridad de la cuenta del sitio que está intentando restablecer se vuelve 100% dependiente de la integridad de la cuenta de correo electrónico. Cualquiera que tenga acceso a su correo electrónico tiene acceso a cualquier cuenta que se puede restablecer simplemente recibiendo un correo electrónico . Para tales cuentas, el correo electrónico es la "llave de todas las puertas" de su vida en línea.
Una forma de mitigar este riesgo es implementar un patrón de preguntas y respuestas de seguridad. Sin duda los has visto antes: elige una pregunta que solo tú tienes que responderconocer la respuesta, después de lo cual, cuando restablezca su contraseña, se le preguntará. Esto agrega confianza de que la persona que intenta restablecer es, de hecho, el propietario de la cuenta.
Volviendo a Sarah Palin, el error fue que las respuestas a sus preguntas / preguntas de seguridad se podían encontrar fácilmente. En particular, cuando usted es una figura pública tan importante, la información sobre el apellido de soltera de su madre, el historial educativo o el lugar donde alguien pudo haber vivido en el pasado no es tan secreto. De hecho, casi cualquier persona puede encontrar la mayor parte. Y así sucedió con Sarah:
El hacker David Kernell obtuvo acceso a la cuenta de Palin al buscar su información de antecedentes, como su universidad y fecha de nacimiento, y luego usar la función de recuperación de contraseña de la cuenta de Yahoo !.
Esto es principalmente un defecto de diseño por parte de Yahoo! - Al señalar estas simples preguntas, la empresa esencialmente saboteó el valor de la pregunta secreta y, por lo tanto, la protección de su sistema. Por supuesto, restablecer las contraseñas de una cuenta de correo electrónico siempre es más difícil porque no se puede demostrar la propiedad enviando un correo electrónico al propietario (sin tener una segunda dirección), pero afortunadamente, hoy en día no hay muchas formas de usar este sistema.
Volviendo a las preguntas secretas, existe una opción para que el usuario pueda crear sus propias preguntas. El problema es que el resultado serán preguntas terriblemente obvias:
¿De qué color es el cielo?
Preguntas que ponen a las personas en una posición incómoda cuando una persona usa una pregunta de seguridad para identificar(por ejemplo, en un centro de llamadas):
¿Con quién me acosté en Navidad?
O preguntas francamente estúpidas:
¿Cómo se escribe "contraseña"?
Cuando se trata de cuestiones de seguridad, los usuarios deben salvarse de sí mismos. En otras palabras, la pregunta secreta debe ser determinada por el sitio mismo, o mejor aún, hacer una serie de preguntas secretas entre las que el usuario puede elegir. Y no solo elija uno ; idealmente, el usuario debe seleccionar dos o más preguntas de seguridad en el momento del registroque luego se utilizará como segundo canal de identificación. Tener múltiples preguntas aumenta la confianza en el proceso de verificación, así como la capacidad de agregar aleatoriedad (no siempre muestra la misma pregunta), además proporciona un poco de redundancia en caso de que el usuario real haya olvidado la contraseña.
¿Cuál debería ser una buena pregunta de seguridad? Esto está influenciado por varios factores:
- Debe ser breve , la pregunta debe ser clara e inequívoca.
- La respuesta debe ser específica : no necesitamos una pregunta que una persona pueda responder de diferentes maneras.
- Las posibles respuestas deben ser variadas : preguntar sobre el color favorito de alguien da un subconjunto muy pequeño de posibles respuestas
- — ( , ),
- — - ,
Da la casualidad de que hay un buen sitio web de preguntas llamado GoodSecurityQuestions.com . Algunas de las preguntas parecen bastante buenas, otras no pasan algunas de las pruebas descritas anteriormente, en particular la prueba de "facilidad de búsqueda".
Permítanme mostrarles cómo se implementan las preguntas de seguridad en PayPal y, en particular, cuánto esfuerzo hace el sitio para identificarlas. Arriba vimos una página para iniciar un proceso (con un CAPTCHA), pero aquí mostramos lo que sucede después de ingresar una dirección de correo electrónico y resolver un CAPTCHA:

Como resultado, el usuario recibe la siguiente carta:

Hasta ahora, esto es normal, pero esto es lo que hay detrás de esta URL de restablecimiento:

Entonces, entran en juego preguntas secretas. De hecho, PayPal también le permite restablecer su contraseña verificando su número de tarjeta de crédito, por lo que hay un canal adicional al que muchos sitios no tienen acceso. Simplemente no puedo cambiar mi contraseña sin responder ambas preguntas de seguridad (o conocer el número de tarjeta). Incluso si alguien secuestra mi correo electrónico, no podrá restablecer la contraseña de mi cuenta de PayPal si no conoce un poco más de información personal sobre mí. ¿Que información? Estas son las opciones de preguntas de seguridad que ofrece PayPal:

La cuestión de la escuela y el hospital puede ser un poco dudosa en términos de facilidad de búsqueda, pero el resto no es tan malo. Sin embargo, para mejorar la seguridad, PayPal requiere una identificación adicional para cambiar las respuestas de seguridad:

PayPal es un ejemplo bastante utópico de restablecimiento de contraseña seguro: implementa un CAPTCHA para reducir el riesgo de fuerza bruta, requiere dos preguntas secretas y luego requiere otro tipo de identificación completamente diferente solo para cambiar las respuestas, y esto es después de que el usuario ya haya iniciado sesión. Por supuesto, esto es lo que esperaríamos de PayPal; es una institución financiera que maneja grandes cantidades de dinero. Esto no significa que cada restablecimiento de contraseña deba seguir estos pasos, en la mayoría de los casos es excesivo, pero es un buen ejemplo de cuándo la seguridad es un asunto serio.
La conveniencia del sistema de preguntas secretas es que si no lo implementó de inmediato, puede agregarlo más tarde si el nivel de protección de recursos lo requiere. Un buen ejemplo de esto es Apple, que recientemente implementó este mecanismo [escrito en 2012] . Una vez que comencé a actualizar la aplicación en el iPad, vi la siguiente solicitud:

Luego vi una pantalla en la que podía seleccionar varios pares de preguntas y respuestas secretas, así como una dirección de correo electrónico de rescate:

En cuanto a PayPal, las preguntas están preseleccionadas y algunas de ellas son bastante buenas:

Cada uno de los tres pares de preguntas y respuestas representa un conjunto separado de posibles preguntas, por lo que hay muchas formas de configurar una cuenta.
Otro aspecto a considerar con respecto a la respuesta a la pregunta de seguridad es el almacenamiento. Encontrar texto sin formato en la base de datos plantea casi las mismas amenazas que en el caso de una contraseña, a saber: revelar la base de datos revela instantáneamente el significado y pone en riesgo no solo la aplicación, sino también aplicaciones potencialmente completamente diferentes que usan las mismas preguntas secretas (esto es nuevamente una cuestión de bayas acai). Una opción es el hash seguro (algoritmo fuerte y sal criptográficamente aleatoria); sin embargo, a diferencia de la mayoría de los casos de almacenamiento de contraseñas, puede haber una buena razón para que la respuesta aparezca como texto sin formato. Un escenario típico es una verificación de identidad por parte de un operador en vivo por teléfono. Por supuesto, en este caso, el hash también es aplicable (el operador simplemente puede ingresar la respuesta nombrada por el cliente), pero en el peor de los casos, la respuesta secreta debe estar en algún nivel del almacén criptográfico, incluso si es solo un cifrado simétrico. Para resumir: ¡ trata los secretos como secretos!
Y el último aspecto de las preguntas y respuestas secretas: son más vulnerables a la ingeniería social. Tratar de obtener directamente una contraseña para la cuenta de otra persona es una cosa, pero entablar una conversación sobre su educación (una pregunta secreta popular) es otra muy distinta. De hecho, puede comunicarse de manera bastante realista con alguien sobre muchos aspectos de su vida que pueden constituir una pregunta de seguridad, sin levantar sospechas. Por supuesto, la esencia misma de la pregunta secreta es que está relacionada con la experiencia de vida de alguien, por lo que se recuerda, y este es precisamente el problema: ¡a la gente le encanta hablar sobre sus experiencias de vida! Es poco lo que se puede hacer al respecto, solo eligiendo las opciones de preguntas de seguridad para que sea menos probable que las elimine la ingeniería social.
[Continuará.]
Publicidad
VDSina ofrece servidores confiables con pago diario , cada servidor está conectado a un canal de Internet de 500 Megabits y está protegido de ataques DDoS de forma gratuita.
