2009-09-04 7 views
25

Si tuviera que hash la contraseña de un usuario antes de enviarla a través de la línea y dejarla en texto sin formato en la memoria, mejoraría la seguridad de la aplicación?¿Tiene sentido la seguridad de la contraseña hash en el extremo del cliente

Supongo que esto mitiga una pequeña fracción de las vulnerabilidades al proteger los datos almacenados en la memoria del cliente. Pero realmente si nos preocupa que alguien lea la memoria del cliente, probablemente haya problemas mayores que no podamos resolver.

Hay algo que no se siente bien acerca de hashing en el extremo del cliente.

¿La práctica de hash de la contraseña en el cliente es una práctica común? ¿Hay otras ventajas o desventajas para hacerlo?

EDITAR: Dado que el canal de comunicación es seguro (SSL). ¿Bajo qué condiciones sería aceptable y valioso usar dicho enfoque? Pregunto esto porque un "profesional de la seguridad" me sugirió que utilicé dicho esquema durante algunas funciones de la aplicación.

+3

La respuesta aceptada es incorrecta. ** Te da una ventaja, ** siempre que salgas picando el hash en el lado del servidor también. Consulte http://security.stackexchange.com/a/23285/2379, http://security.stackexchange.com/a/23033/2379 – Pacerier

Respuesta

20

Cuando el cliente envía algo, si es P o H(P)H(H(P)) o cualquier persona que intercepta esto puede simplemente volver a enviar exactamente lo mismo que, con lo que cualquier función como esto equivale a utilizar la contraseña directamente

Es por eso que debe usar un nonce; El servidor puede dar salida aleatoria a k y el cliente calculará H(P,k) y lo enviará al servidor. HMAC es una implementación popular de este método.

Siempre que el servidor nunca acepte el mismo nonce dos veces, esto es seguro contra un ataque de repetición.

+12

... pero esto crea una oportunidad de DoS: captura cada notificación del servidor que se envía al cliente y úsala antes de que el cliente legítimo pueda hacerlo; voila, ahora el cliente no puede iniciar sesión en absoluto, ya que cada nonce ya ha expirado en el momento en que el cliente envía su solicitud. No es un escenario completamente práctico, pero, como siempre, la seguridad debe estar en equilibrio con la facilidad de uso, y, a veces, agregar uno reduce al otro. – Piskvor

+5

Como se señala en otras respuestas, hay algunas * leves * ventajas para el hash en el cliente ya que muchos usuarios reutilizan contraseñas con múltiples servicios. – pettys

+0

@pettys: No, no hay. Existen ventajas al hacer encriptación o un hash mac protegido, pero no hay ventajas al hacer un hash sin sal ni protección en el cliente. – geocar

4

Solo asegúrese de estar enviando su contraseña a través de un canal seguro (SSL). Si el cliente puede tener una aplicación de lectura de memoria privada, es muy probable que tenga problemas mayores, como por ejemplo un registrador de teclas.

14

El hash es idéntico a la contraseña de un POV de seguridad en el escenario que describe: si intercepto el hash, no necesito saber la contraseña, puedo enviar el hash al servidor que he interceptado.

Authentication protocols ir a cierta longitud para evitar este problema; la seguridad es difícil, y es mejor que selecciones e implementes un protocolo bien entendido en lugar de desarrollar el tuyo propio.

Si su tráfico pasa por SSL, está a salvo de la interceptación y el uso de hash le ofrece poco beneficio adicional.

+12

La única forma en que no es equivalente es la contraseña del usuario, que puede usar para cuentas múltiples - no está en la naturaleza. –

+1

@LucasOman Lo sentimos, pero un solo hash básico no hace nada para proteger una contraseña y proporciona una falsa sensación de seguridad. Herramientas como hashcat pueden ejecutar miles de millones de hashes básicos por segundo en hardware básico. La única forma de proporcionar protección con un hash del lado del cliente es ejecutar un BCrypt/PBKDF2 completo con decenas o cientos de miles de iteraciones, como lo hacemos para almacenar contraseñas en el servidor. Eso es una tontería porque el hash resultante sigue siendo la contraseña en lo que respecta al servidor. Solo usa SSL. – Tito

+1

@Tito "un solo hash básico no hace nada para proteger una contraseña" Esa es una mentira flagrante. Hashcat está haciendo un ataque de fuerza bruta, lo que significa que si la contraseña tiene algún tipo de longitud, el atacante no podrá adivinarla. Por lo tanto, si se usa la misma contraseña larga en varios servicios, un atacante con solo el hash solo puede usarla en el servicio que acepta ese hash. Y si cada sitio que hizo esto usó el mismo algoritmo hash, pero un nonce diferente, específico del proveedor, entonces prácticamente se podría garantizar que el hash solo sería útil en un sitio. –

12

El envío de una contraseña hash no mejorará la seguridad de su sitio, como otros han señalado (ya que acepta una contraseña hash, todo lo malo que necesita saber es la versión hash). Tampoco es realmente seguro, ya que es probable que el tipo malo cargue su página de inicio de sesión y examine el Javascript o Java desplegado.

Lo que hace es evitar que alguien que mira los paquetes pueda sacar una contraseña, y que es moderadamente útil. Muchas personas usan la misma contraseña en varios sitios (lo hago para todos menos para los sitios de mayor seguridad) y, por lo tanto, si puede obtener una contraseña de ellos, puede iniciar sesión en otras cuentas en otros sitios.

También evita que la contraseña real se almacene, incluso temporalmente, en su sitio, y eso puede proporcionar un poco más de seguridad si su sitio se ve comprometido.

Así que, si bien consideraría que el hash del lado del usuario podría ser algo bueno, no vale la pena tener demasiados problemas.

Y, como han dicho otros, no transfiera su propia seguridad. Hay demasiadas cosas que pueden salir mal. No los notarás casi tan rápido como lo hará un chico malo practicado.

+0

'Tampoco es realmente seguro, ya que el tipo malo puede cargar su página de inicio de sesión y examinar el Javascript o Java implementado. "La buena seguridad no debe depender de que el atacante no conozca tu algoritmo. Por lo tanto, este punto es falso. Es la clave que estás tratando de hacer más difícil de determinar, no el algoritmo. El atacante también puede buscar la fuente código de implementación de SSL. No significa que el atacante puede romper SSL. –

5

No, hash en el cliente no protege la contraseña 'completamente'. Cuando uno opta por cifrar la contraseña en el cliente, el resumen enviado al servidor, básicamente se convierte en la contraseña. Esto no es un problema en sí mismo si se implementa SSL.

Sin embargo, este esquema termina creando más problemas de los que resuelve. Si el servidor comparase el hash enviado por el cliente con un hash almacenado en la base de datos sin realizar ninguna otra operación criptográfica (especialmente hash de los datos de entrada), entonces la contraseña se almacena en texto claro para todos los propósitos prácticos. Cualquier persona con acceso al hash almacenado puede volver a enviarlo al servidor y obtener acceso a las cuentas.

En términos simples, si el hash enviado (que es lo mismo que el hash enviado) se filtró a través de cualquier otra vulnerabilidad dentro de la aplicación (mediante inyección SQL, por ejemplo) entonces la aplicación tiene una vulnerabilidad donde protege las contraseñas inadecuadamente

Si la vulnerabilidad subyacente debe ser reparada, entonces es necesario tratar el hash presentado como una contraseña en texto claro, que luego debe ser hash (preferiblemente con una sal) antes de la comparación con un hash almacenado.

+2

'hash en el cliente no protege la contraseña 'completamente'. Bueno, nada protege la contraseña _completamente_. Si tu atacante está dispuesto a matar a un niño cada minuto hasta que los dejes publicar en tu blog de WordPress, supongo que finalmente les dejarás subir todas esas imágenes de gatos. El punto es si protege la contraseña _más_, a la que aparentemente su respuesta es 'no'. 'la contraseña se almacena en texto claro para todos los propósitos prácticos' No, no lo es. El ** token de autenticación ** está en texto plano, pero la ** contraseña ** está oculta. –

+0

Sé que la distinción entre token de autenticación y contraseña puede parecer pedante, pero si soy alguien que habitualmente usa códigos activos de lanzamiento nuclear como contraseñas, o soy Rush Limbaugh y mi contraseña es "Maté a una niña pequeña en 1993 y esto es mi admisión legalmente vinculante de culpa ", la diferencia es bastante importante. –

-2

Hashing en el lado del cliente abre otro gran agujero: puede exponer el algoritmo de hash. No dice si esto está basado en la web (cliente = JavaScript) o cliente grueso, pero les está dando más información. Dado que el canal es seguro, no tiene que preocuparse por la contraseña de texto claro que se olfatea.

Además, si su algoritmo hash requiere una sal, estaría exponiendo su sal, lo que significa que si alguna vez tienen acceso a la base de datos, podrían descifrar cada contraseña.

+6

No es cierto. 1) La seguridad nunca debe confiar en ocultar el algoritmo que se está utilizando. 2) Incluso si conoce la sal, es muy difícil descifrar las contraseñas (siempre que estén encriptadas usando las formas estándar) a menos que obtenga una tabla arcoiris de esa 'sal'. – sojin

+2

Esta respuesta parece malinterpretar la función de una sal. Si está utilizando la misma sal para cada contraseña, entonces lo está haciendo mal y es muy posible que no use sal. –

11

Sí, deberías.

IEEE tuvo una violación de datos en la que se expusieron 100K correos electrónicos y contraseñas de un weblog.

http://ieeelog.com/

Obviamente, IEEE no debería haber expuesto su blog! Pero si hubieran cifrado las contraseñas en el lado del cliente, esto no habría sido tan malo.

Como dice la primera respuesta, debería usar un nonce. Si usa un tiempo de espera suficientemente largo (por ejemplo, 128 bits), no necesita preocuparse por la reutilización, ya que el servidor nunca pedirá el mismo nonce dos veces (suponiendo que el CRNG se siembra correctamente, etc.).

4

Creo que tiene sentido en una circunstancia; no quiere ni siquiera saber la contraseña de texto sin formato del cliente. Si hash en el lado del cliente, sal y iterativamente hash ese hash de la misma manera que lo haría con un texto sin formato pw. Aparte de eso, es un poco tonto.

0

Te puedo dar diferentes tipos de enfoque Si tiene no SSL puede hash de la contraseña en el lado del cliente y de nuevo hash en el lado del servidor con cualquier otro método de hash y almacenarlos en la base de datos y cuando la conexión del usuario con la contraseña haga el mismo proceso y haga coincidir la contraseña doble hash con hashes almacenados

+0

El peligro allí, y lo que se menciona en otros comentarios a otras respuestas, es el [ataque de repetición] (http://en.wikipedia.org/wiki/Replay_attack) –

+1

@ George'Griffin - ¿Cómo es relevante un ataque de repetición? ofuscar o encriptar la transmisión? ¿No se aplicaría también a la transmisión de texto sin formato, excepto en ese caso, la contraseña exacta podría ser comprometida más rápidamente o incluso inadvertidamente? – groovenectar

Cuestiones relacionadas