¿Usando un hash de contraseña ... como contraseña? [duplicar]

2

Ok, esta es probablemente una idea realmente estúpida, pero realmente no puedo ver por qué sería una mala idea. Tal vez alguien me pueda iluminar.

¿Por qué no pudo ingresar un buen algoritmo de hash de contraseña como bcrypt y luego usar el hash como su contraseña para el sitio web?

Debido al Efecto Avalanche, esto podría permitir a los usuarios usar derivaciones sutiles de su contraseña regular para crear contraseñas diferentes (y posiblemente mejores) de manera competente para usar en sitios web reales.

Por ejemplo, digamos que la contraseña de un usuario es "password123", y quieren iniciar sesión en algunos sitios diferentes, por lo que agregan el nombre del sitio al principio de su contraseña, por lo que:

Amazon.com="amazonpassword123"

Facebook.com="facebookpassword123"

Y así sucesivamente .....

Normalmente, esto sería una muy mala práctica, ya que sería trivial para un atacante adivinar el sistema de nombres de este usuario para las contraseñas. Pero si el usuario ejecutó sus contraseñas a través de un algoritmo de hash ANTES de iniciar sesión en estos sitios web y luego utilizar el hash como contraseña, tenemos algo que es muy fácil de recordar y (posiblemente) más seguro.

¿Hay alguna desventaja que no esté viendo?

    
pregunta user97462 15.11.2015 - 03:17
fuente

2 respuestas

1

No. Es una gran idea. El truco es lograr que esos hashes cumplan con los requisitos de longitud y complejidad de diferentes sitios.

PwdHash es un gran ejemplo. Utiliza HMAC-MD5, pero quita tantos bits de la salida que probablemente esté bien. (Ese es un término técnico. Además, la resistencia de pre-imagen MD5 aún no se ha roto). Lo que es más importante, resolvieron el problema de los requisitos de longitud y complejidad muy bien, y existe un software que funciona en muchas plataformas diferentes (Firefox, Chrome, Mac OS, iOS, Android, el sitio web en sí).

Master Password es otra aplicación, que utiliza HMAC-SHA-256, pero solo está disponible en Mac e iOS. Además, es un poco torpe en su técnica de codificación. Sus valores predeterminados son una entropía demasiado baja porque intentan ser "pronunciables" controlando las posiciones de las vocales. Presenté un informe de error y me dijeron que la entropía es irrelevante y que me empape la cabeza. Está bien si utilizas la configuración paranoica para la serialización, pero para mí es demasiado doloroso en comparación con el PwdHash.

Es un poco triste que este sea el estado de la técnica en esta categoría, y también es triste que la gente de PwdHash no solo usara scrypt.

    
respondido por el Reid Rankin 15.11.2015 - 04:12
fuente
0

Una construcción como hash(site_name + pw) generará una contraseña segura siempre que la contraseña sea alta entropía y el hash tenga suficientes bits (por ejemplo, 128+ bits que tendrá su hash criptográfico estándar; simplemente no use hashes no criptográficos como crc32). Si usa algo como pw = password123 que se adivina fácilmente, entonces un atacante sofisticado podrá descubrir su esquema al ver su contraseña en un sitio que controlan y luego forzar su contraseña para todos los demás sitios (por ejemplo, si su la contraseña para example.com es md5("examplepassword123") puede ser posible revertirla probando contraseñas de la forma md5(site_name + pw) - puede generar miles de millones de hash md5 por segundo por computadora. Es una mala idea confiar en que un atacante no conozca su esquema de generación de contraseñas - en lugar de eso, debe confiar en que sus contraseñas reales tengan una alta aleatoriedad intrínseca (consulte Principio de Kerckhoffs ).

Sin embargo, si usas algo como bcrypt, estarás bien con una contraseña débil ya que bcrypt crea un sal aleatorio de 128 bits que proporciona más que suficiente entropía para evitar que incluso la contraseña más débil sea razonable (asumiendo que se usa la sal) difiere entre tus hashes). Tenga en cuenta que tendrá que almacenar esta sal creada al azar para poder volver a iniciar sesión, por lo que en este punto probablemente habría sido más sencillo utilizar una contraseña generada de forma completamente aleatoria para cada sitio web que visite.

Para dar un ejemplo con bcrypt usando python (en el intérprete de ipython):

In [1]: import bcrypt

In [2]: bcrypt.hashpw('amazonpassword123', bcrypt.gensalt(10))
Out[2]: '$2b$10$//rLpdWc/0hljdOf90366u1uaRch7q59AxF0qcodHvDckO1nd..ky'

In [3]: bcrypt.hashpw('amazonpassword123', bcrypt.gensalt(10))
Out[3]: '$2b$10$eUsCtvQ9mvYA2qAEShaqjOqgYogRP4mohEag5bm3Hls10JPSQxU4y'

In [4]: bcrypt.hashpw('amazonpassword123', Out[2])
Out[4]: '$2b$10$//rLpdWc/0hljdOf90366u1uaRch7q59AxF0qcodHvDckO1nd..ky'

Tenga en cuenta que el hash de la misma cosa dos veces con bcrypt genera un hash completamente diferente, ya que utilizaron dos sales diferentes creadas al azar (con 2 ^ 10 rondas de hashing); Es por esto que Out[2] != Out[3] . Esto no es problemático cuando se comprueban contraseñas contra un hash bcrypt (ya que el hash contiene el salt), por lo que puede proporcionar el hash almacenado en la base de datos para usarlo como sal y luego verificar que coincida con el hash almacenado; por eso Out[2] == Out[4] .

El otro problema del que debe preocuparse es de los sitios que truncan su contraseña en silencio. El uso de, por ejemplo, un hash bcrypt completo, donde los primeros siete caracteres son $2b$<lg(number of rounds)>$ puede debilitar gravemente su contraseña. Por ejemplo, una VPN proporcionada por un proveedor conocido que uso para el trabajo trunca mi contraseña de usuario a 8 caracteres (aunque me permite escribir contraseñas mucho más largas, solo verifica los primeros 8).

    
respondido por el dr jimbob 15.11.2015 - 04:52
fuente

Lea otras preguntas en las etiquetas