¿Es seguro almacenar contraseñas en las cookies?

La página de inicio de mi aplicación web tiene una checkbox RememberMe . Si el usuario lo comprueba, almacenaré el id. De correo electrónico y la contraseña en las cookies. Este es mi código:

if (this.ChkRememberme != null && this.ChkRememberme.Checked == true) { HttpCookie cookie = new HttpCookie(TxtUserName.Text, TxtPassword.Text); cookie.Expires.AddYears(1); Response.Cookies.Add(cookie); } 

Lo que quiero saber es:

  • ¿Es seguro almacenar contraseñas en las cookies?
  • ¿Cuál es la forma correcta de hacer lo mismo?
  • ¿Cuáles son las mejores prácticas para establecer el tiempo de una cookie?

    NO es seguro almacenar contraseñas en las cookies porque están disponibles como texto sin formato.

    Un buen lugar para encontrar respuestas sobre cookies es Cookie Central. Para la membresía generalmente se usa una cookie con una cadena larga llamada ‘token’ que se emite desde el sitio web cuando proporciona su nombre de usuario y contraseña. Más sobre el proceso que puedes encontrar en este artículo . Al utilizar la autenticación de formularios en ASP.NET, puede configurar la cookie de autenticación de esta manera:

     FormsAuthentication.SetAuthCookie(userName, isPersistanceCookie); 

    El segundo parámetro se usa para la funcionalidad “Recordarme”; si es verdadero, creará cookies persistentes que durarán una vez que salga del sitio. También puede manipular programáticamente la cookie de esta manera:

     HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 

    ¡No! ¡No almacene contraseñas en las cookies!

    En ASP.NET, use

     FormsAuthentication.SetAuthCookie(username, true); 

    El valor del segundo argumento determina si la cookie es persistente (el valor de la checkbox Remember me).

    No, no de forma remota segura. No tiene garantía de que las cookies no se almacenen en texto plano (y de hecho, la mayoría de las implementaciones las almacenan como texto sin formato).

    Eso sí, “recordarme” es inherentemente inseguro, ya que cualquier persona que intercepte la cookie tiene acceso a la aplicación. Pero exponer la contraseña de un usuario lo lleva un paso más abajo en la escalera de la inseguridad. 🙂 Y probablemente enloquezca al usuario, si lo descubren.

    Utilizo una cadena de cookies cifradas que incorpora el nombre de la cuenta del usuario combinado con un token que no está asociado (de ninguna otra manera) con la cuenta del usuario, excepto en una tabla en mi servidor. Cuando el usuario vuelve al sitio, desciframos la cookie y buscamos si ese token está de hecho asociado con esa cuenta. El token (y, por lo tanto, la cookie) cambia cada inicio de sesión automático e invalida el utilizado para ese inicio de sesión automático. (Hay una relación muchos a uno entre los tokens y la cuenta, para permitir el inicio de sesión automático desde varias ubicaciones. Puede limitar eso si lo desea). El tiempo de espera de los tokens no se usa dentro de X días. (Esto no solo se hace limitando la duración de la cookie, sino que también se realiza en el servidor). Hay algunas otras cosas que incluyo para dificultar la vida de alguien que intenta decodificar la cookie (habiendo descifrado correctamente) ) o usar una cookie robada (que no requiere descifrado), pero no tiene sentido ir demasiado rápido (de nuevo, “recordarme” es intrínsecamente inseguro).

    Lo uso en un sitio donde la seguridad robusta no es realmente necesaria (obviamente) y que tiene una gran cantidad de clientes IP dynamics, por lo que no bash bloquearlo en una IP. Pero incluso bloquearlo en un IP no lo hace seguro, solo reduce un poco la superficie de ataque.

    Usted se estará preguntando por qué tengo el nombre de usuario en la cookie. Para fines de “recordarme” directamente, no recomendaría tenerlo allí, incluso si está encriptado (después de todo, es la mitad del par de autenticación en un sistema de nombre de usuario + contraseña). Me sorprendió un poco encontrarlo en nuestra cookie cuando miré el formato cuando me recordaba cómo hicimos esto para esta pregunta; pero luego vi los comentarios explicando por qué están ahí y hay razones que no están relacionadas con “recordarme” (no necesariamente razones persuasivas , en retrospectiva, sino razones).

    En una nota final, el hecho de que “recordarme” es intrínsecamente inseguro es una de las muchas razones por las cuales los registros del sitio son muy importantes y por qué debería requerir la reverificación de la contraseña en el proceso de permitir cambios en información importante de la cuenta (para hacerlo más difícil alguien que ha robado la cookie para tomar posesión de la cuenta).

    Esto es lo que nunca debes hacer, porque es muy fácil cambiar el valor de una cookie y enviarla al servidor. Incluso el almacenamiento de “usuario es alojado como ‘naivists'” en una cookie es incorrecto, porque podría cambiarlo a “usuario conectado como ‘Pandiya Chendur'”.

    Lo que puede hacer en las cookies es dar información a los clientes que, incluso si se modifica, no tiene sentido para el servidor. Por ejemplo, color favorito, diseño de la primera página, etcétera.

    Puede darles una ID de sesión que se almacena en una cookie, ya que no pueden hacer nada mejor por sí mismos, si cambian el valor a otra cosa (a menos que conozcan una ID de sesión válida de otra sesión).

    Qué dice MSDN de Microsoft sobre el uso de cookies :

    Los problemas de seguridad con las cookies son similares a los de obtener datos del cliente. En su aplicación, las cookies son otra forma de entrada del usuario y, por lo tanto, están sujetas a examen y suplantación. Un usuario puede, como mínimo, ver los datos que almacena en una cookie, ya que la cookie está disponible en la propia computadora del usuario. El usuario también puede cambiar la cookie antes de que el navegador se la envíe.

    Nunca debe almacenar datos confidenciales en una cookie, como nombres de usuario, contraseñas, números de tarjetas de crédito, etc. No coloque nada en una cookie que no deba estar en manos de un usuario o de alguien que pueda robar la cookie de alguna manera.

    Del mismo modo, desconfíe de la información que obtiene de una cookie. No suponga que los datos son los mismos que cuando los escribió; utilice las mismas medidas de seguridad al trabajar con los valores de las cookies que con los datos que un usuario ha escrito en una página web. Los ejemplos anteriores de este tema mostraban encoding HTML de los contenidos de una cookie antes de mostrar el valor en una página, como lo haría antes de mostrar cualquier información que obtenga de los usuarios.

    Las cookies se envían entre el navegador y el servidor como texto sin formato, y cualquier persona que pueda interceptar su tráfico web puede leer la cookie. Puede establecer una propiedad de cookie que haga que la cookie se transmita solo si la conexión usa Secure Sockets Layer (SSL). SSL no protege la cookie de ser leída o manipulada mientras está en la computadora del usuario, pero evita que la cookie se lea durante el tránsito porque la cookie está encriptada. Para obtener más información, vea Prácticas de seguridad básicas para aplicaciones web.

    No es seguro almacenar contraseñas en las cookies porque están disponibles como texto sin formato. pero si su criterio preferido es hacerlo o cualquier requisito de usuario está allí, puede hacerlo encriptando las cadenas. eso puede hacer esto lo suficientemente seguro.

    pero no es recomendado,

    Creo que debes crear un token con nombre de usuario y una cadena de autenticación cifrada que obtienes de Windows Identity. No es necesario almacenar la contraseña en la cookie. Tenemos nuestra aplicación que almacena el nombre de usuario y la cadena autenticada

    Por cierto, las contraseñas de la tienda no son seguras en todas partes, tanto del lado del cliente como del lado del servidor.

    No necesitas hacer eso.

    Lo que dijo Branislav , y …

    Además de no incluir datos confidenciales en sus cookies, también debe protegerlos colocando al menos lo siguiente en su web.config:

      

    Para obtener más detalles, consulte: ¿Cómo configura exactamente httpOnlyCookies en ASP.NET?

    No es para nada seguro. Las cookies se almacenan en la computadora del cliente, que puede ser alterada.

    • Si usa SSL, lo cual debería hacer si está transmitiendo cualquier información segura, eso elimina que un tercero escuche su tráfico web. Este sería el mismo problema independientemente de almacenar las credenciales de un usuario en una cookie porque cuando inician sesión envían su nombre de usuario y contraseña al servidor de todos modos, donde asumo que el servidor lo haste y lo compara con la contraseña hash que tiene para ese usuario.

    • Otros dominios nunca podrán leer su cookie debido al origen cruzado, así que eso no es un problema.

    • Entonces realmente es el único “agujero de seguridad” si quiere llamarlo si alguien obtiene acceso físico a su computadora. Si eso sucede, es probable que obtengan de todos modos cualquier información que desee de esa persona. ¿Cómo se explica cuándo Chrome Auto completa formularios de inicio de sesión para usted, es seguro? Estoy seguro de que no lo están almacenando en texto plano, pero eso ni siquiera importa. Si va a una página que se completa automáticamente con Chrome, puede copiar la contraseña fuera del formulario y observar que ahora tiene la contraseña de esa persona.

    • Realmente se trata de qué tan “seguro” lo necesita. Acepto que encriptar la información de un usuario con un vencimiento como un token es la mejor manera de autenticar las llamadas de servicio y proporciona flexibilidad. Simplemente no veo el problema con el almacenamiento de credenciales de inicio de sesión en una cookie.