Hash de contraseña del lado del cliente

27

Editar : actualizado para poner más énfasis en el objetivo: tranquilidad para el usuario y no reforzar la seguridad.

Después de leer algunas discusiones aquí sobre el hashing de contraseñas del lado del cliente, todavía me pregunto si podría estar bien usarlo en una situación particular.

Específicamente, me gustaría que el cliente, un programa Java, modificara su contraseña usando algo como PBKDF2, usando como combinación una combinación de su dirección de correo electrónico y una porción de bytes constante-específica . La idea es que el hash sea reproducible para la autenticación, pero es de esperar que no sea vulnerable a los ataques de ingeniería inversa (para descubrir la contraseña literal) aparte de la fuerza bruta si los datos del servidor están comprometidos.

Goz :

El hashing del lado del cliente es para la tranquilidad del usuario que el servidor nunca recibe su contraseña literal, incluso si de todos modos existe la seguridad de que la hashing esté almacenada. Otro beneficio adicional (¿o tal vez un pasivo?) Es que el costo de hashing de un PBKDF2 iterado o similar recae en el cliente.

Las características del entorno son:

  1. Todas las comunicaciones cliente-servidor están encriptadas.
  2. Los mensajes reproducidos no están permitidos. es decir. el hash enviado desde el cliente no puede ser utilizado efectivamente como contraseña por un intruso.
  3. Las direcciones IP de prohibición de ingreso y de inclusión en listas negras son posibles para varios intentos de inicio de sesión fallidos en un corto período de tiempo. Esto puede ser por cuenta de usuario o para todo el sistema.

Preocupaciones:

  1. "Evite crear esquemas de autenticación caseros".
  2. La sal es determinista para cada usuario, incluso si los hashes producidos serán específicos para esta aplicación debido a los bytes extra (idénticos) que se arrojan a la sal. ¿Esto es malo?
  3. Las autenticaciones en el extremo del servidor se realizarán sin demora significativa, sin el costo de hashing. ¿Aumenta esto la vulnerabilidad al ataque de autenticación de fuerza bruta distribuida?
  4. Los clientes malintencionados pueden proporcionar un hash débil para sus propias cuentas. En realidad, no estoy demasiado preocupado por esto.
  5. ¿Debería el servidor volver a limpiar los hashes del cliente antes de almacenar?

¿Pensamientos?

    
pregunta Foy Stip 23.10.2012 - 02:47
fuente

6 respuestas

36

El hash en el lado del cliente no resuelve el problema principal que el hash de la contraseña pretende resolver: qué sucede si un atacante obtiene acceso a la base de datos de contraseñas con hash. Dado que las contraseñas (con hash) enviadas por los clientes se almacenan tal como están en la base de datos, dicho atacante puede hacerse pasar por todos los usuarios enviando al servidor las contraseñas con hash de la base de datos tal como están.

Por otra parte, el hash en el lado del cliente es bueno porque garantiza al usuario que el servidor no tiene conocimiento de la contraseña, lo cual es útil si el usuario usa la misma contraseña para múltiples servicios (como la mayoría de los usuarios).

Una posible solución para esto es el hashing tanto en el lado del cliente como en el lado del servidor. Todavía puede descargar la operación pesada PBKDF2 al cliente y hacer una sola operación de hash (en la contraseña hash PBKDF2 del lado del cliente) en el lado del servidor. El PBKDF2 en el cliente evitará los ataques de diccionario y la única operación de hash en el lado del servidor evitará el uso de las contraseñas de hash desde una base de datos robada tal como está.

    
respondido por el David Wachtfogel 23.10.2012 - 06:54
fuente
9

Hay poco tiempo cuando el hashing del lado del cliente vale la pena. Una de esas circunstancias es cuando el proceso de hash es computacionalmente intensivo, lo que puede ser el caso con PBKDF2.

Respondiendo a sus inquietudes:

  1. También evite las sugerencias no validadas sobre la criptografía que encuentre en Internet. (Descargo de responsabilidad: no soy Bruce Schneier).
  2. Las sales deterministas no son un problema, el único requisito real de la sal es que sea único para cada usuario. El verdadero propósito de la sal es evitar que una fuerza bruta en una contraseña se convierta en una fuerza bruta en todas las contraseñas en el caso de una base de datos comprometida. Incluso si almacenara un archivo sal aleatorio en su base de datos justo al lado de la contraseña con hash, todavía alcanzaría este objetivo, siempre que cada usuario sea diferente.
  3. Como mencioné anteriormente, PBKDF2 está bien porque puedes decidir arbitrariamente la dificultad computacional del hash. Puede seleccionar una c de tal manera que un solo hash en el hardware moderno demore unos segundos, eliminando efectivamente el riesgo de un ataque de fuerza bruta de nivel API. (Por supuesto, es posible que sus clientes no disfruten de un retraso tan largo al iniciar sesión).
  4. Los usuarios pueden elegir contraseñas simples, solo se están haciendo daño a sí mismos. Si quisiera eliminar este riesgo, haría que el servidor generara el hash la primera vez, siempre y cuando la contraseña pase por un canal cifrado.
  5. Sí, y también necesitarás untar estos. En el caso de un compromiso de la base de datos, debe asegurarse de que el atacante no obtenga información que le permita autentificarse directamente como cualquier usuario en su sistema. Una advertencia aquí es que no desea que su hash del lado del servidor sea computacionalmente intensivo como lo es el hash del lado del cliente. Si su hash del lado del servidor requiere demasiado esfuerzo, se abre a un vector de ataque de Denegación de Servicio que agota la CPU: un atacante simplemente envía por correo basura los intentos de autenticación de contraseñas vacías en Tor, las contraseñas que su servidor debe probar antes de que sepa que son. fraudulento, finalmente te deja con un servidor abrumado ..
respondido por el Motoma 23.10.2012 - 15:42
fuente
7

Si hash la contraseña en el lado del cliente, cualquiera que sea el resultado ES la contraseña, no obtendrás ninguna seguridad real. Cualquier hack o pérdida de información que hubiera revelado la contraseña de texto sin formato revelará la contraseña con hash, que es la contraseña real.

Esto no debe confundirse con esquemas de autenticación de conocimiento cero, donde un intercambio de mensajes prueba que el cliente conoce la contraseña real, sin transmitirla realmente.

    
respondido por el ddyer 23.10.2012 - 09:04
fuente
5

Parece que estás intentando inventar tu propio protocolo criptográfico. A partir de la descripción de su enfoque, no parece que tenga los antecedentes para hacerlo de manera segura. Recomiendo usar los protocolos existentes en lugar de crear los suyos.

Primero, no está claro qué modelo de amenaza crees que estás burlando. Cita algo llamado "ataque de ingeniería inversa" que no tiene una definición o significado real.

Segundo, su comprensión del propósito de una sal y las mejores prácticas para su generación parecen faltar. No se requiere que las sales se mantengan en secreto. Puede (y debe) generar un salt único de un CSPRNG para cada nuevo token de autenticación, y no de algo como una dirección de correo electrónico (que podría cambiar). Las sales fijas para aplicaciones específicas a veces se llaman "pimientos", y no conozco ninguna literatura criptográfica que respalde o aliente su uso.

Tercero, PBKDF2 está bien, pero en serio solo use BCrypt . BCrypt fue diseñado para esto y está en uso generalizado. Las buenas implementaciones de BCrypt manejarán la generación de sal y la calibración / autodetección del factor de trabajo para usted. Deberá implementar estas cosas usted mismo para usar PBKDF2, y casi inevitablemente cometerá errores.

En cuarto lugar, existe un enfoque existente de lo que parece estar intentando hacer. La autenticación de conocimiento cero se puede realizar con SRP . La contraseña del usuario nunca se transmite a través del cable, y un hombre en el medio no puede oler nada útil para autenticarse. Sin embargo, aparentemente es difícil de implementar correctamente y no hay muchas bibliotecas existentes para hacerlo, lo que debería darle una idea de lo difícil que es realmente el problema.

Larga historia corta: no inventes tu propio cripto. Utilice soluciones y protocolos que están ampliamente implementados y han resistido la prueba del tiempo.

    
respondido por el Stephen Touset 23.10.2012 - 22:02
fuente
4

Hashing en el cliente puede ser una buena idea en algunas circunstancias y por algunas razones, pero no haría que la "tranquilidad del usuario" sea una de ellas. Estoy totalmente de acuerdo para que los usuarios tengan una mentalidad armoniosa y estén en armonía con el Universo, pero me parece dudosa la idea de promover una forma de inducir a los usuarios a reutilizar la misma contraseña en varios sitios.

Un buen caso para el hashing del lado del cliente es la forma en que funcionan algunas "cajas fuertes de contraseñas": calculan una contraseña específica del sitio al incluir la "contraseña maestra" del usuario junto con el nombre del sitio. Esto brinda la mayor parte de la facilidad de uso de usar siempre la misma contraseña en todas partes, mientras que en realidad no le da su contraseña maestra a docenas de sitios distintos. Pero esto funciona solo mientras el algoritmo de derivación de contraseñas sea genérico y no cambie; esto parece estar mucho mejor abordado por una extensión del navegador web que por un applet proveniente de los sitios (todos los sitios tendrían que cooperar para usar applets que usen el mismo algoritmo de derivación de contraseña, con datos específicos del sitio). / p>

Otro buen caso para el hash de contraseñas en el lado del cliente es cuando se usa un hash lento (para hacer que el descifrado de contraseñas sea más difícil para un atacante que pueda tomar una copia de la base de datos de contraseñas con hash); es tentador tratar de descargar el costo en el cliente, ya que, cuando el cliente desea conectarse, está casi siempre inactivo e interesado activamente en conectarse. Sin embargo, el hashing lento es una carrera de armamentos entre el atacante y el defensor. El uso de Java inducirá una desaceleración (por un factor típico de 3), y algunos sistemas cliente pueden ser bastante débiles (por ejemplo, teléfonos inteligentes baratos o computadoras de diez años). Esto es como levantar una espada en lugar de un rifle de asalto antes de entrar en una batalla donde el oponente traerá un tanque).

Pero si lo que desea, como usuario, es proteger su contraseña contra los procedimientos de almacenamiento descuidados de un sitio, entonces la forma correcta de hacerlo es para elegir una contraseña diferente para cada sitio . (Personalmente, guardo un archivo de contraseñas y todas mis contraseñas se generan de forma aleatoria).

    
respondido por el Thomas Pornin 23.02.2013 - 23:54
fuente
4

Un empleado de Google está trabajando en algo similar llamado TLS-OBC. Este borrador de RFC permite al cliente codificar la contraseña y vincularla a una sesión TLS.

Específicamente puede estar interesado en este sitio web enlace

y este enlace en Autenticación de usuario fuerte enlace

:: Actualizar

OBC y posiblemente el otro ahora está integrado en el estándar de autenticación FIDO.

    
respondido por el random65537 23.10.2012 - 15:54
fuente

Lea otras preguntas en las etiquetas