¿Cuál es la ventaja real de usar un algoritmo "más seguro" como bcrypt para el hashing de contraseñas?

1

Leí este artículo sobre el hashing de contraseñas usando bcrypt como el método recomendado . El consejo es similar a lo que dicen sobre las noticias de piratas informáticos acerca de no usar algo como SHA2 + salt . Hay otras respuestas en el infosec StackExchange sobre por qué no deberíamos utilizar algo como SHA-256. El conocimiento generalmente aceptado es:

  

SHA2 es rápido, lo cual es malo (bcrypt es deliberadamente lento para que podamos sortear ley de Moore )

Como usted sabe, si usamos bcrypt, para codificar algo con un sal criptográficamente aleatorio, podríamos obtener esta cadena: $2a$13$ZyprE5MRw2Q3WpNOGZWGbeG7ADUre1Q8QO.uUUtcbqloU0yvzavOm , y la sal está contenida en esa cadena.

Mi pregunta es un poco multifacética:

  • Si un atacante obtiene acceso a la base de datos con acceso de escritura, podrían volver a escribir la contraseña de alguien en la tabla con su propio hash e iniciar sesión en la cuenta de ese usuario, ¿verdad? A menos que ese no sea su objetivo específico (por ejemplo, tal vez no quieran que nadie sepa que accedieron a la base de datos). O si tienen acceso de solo lectura, supongo que es una historia diferente.

  • Aparte del hecho de que bcrypt es deliberadamente lento, ¿existe alguna otra ventaja para almacenar la sal en el mismo hash que la contraseña en lugar de tener tanto user.hash como user.salt en un registro si no uso bcrypt? O en ese caso, ¿es generalmente una buena práctica almacenar hashes y sales en tablas / bases de datos separadas (y luego presentar la desventaja de las búsquedas de tablas / bases de datos múltiples como se menciona en uno de los comentarios)?

También obtenemos el problema de que bcrypt presenta problemas de rendimiento menores (sí, dentro del rango de milisegundos) (a propósito) al realizar búsquedas, lo cual es insignificante en la mayoría de los casos, pero parece que la única protección que realmente obtener de bcrypt hace que sea difícil procesar por lotes una tabla de usuarios completa e iniciar sesión de forma encubierta en las cuentas de los usuarios (o vender su información, o lo que sea). ¿Por qué no usar algo como SHA2 + salt entonces?

    
pregunta Josh Beam 19.01.2016 - 00:54
fuente

2 respuestas

6

Obtener acceso de solo lectura es un escenario mucho más probable que el acceso de escritura. Después de todo, el acceso de lectura a un servidor de prueba o copia de seguridad antiguo es casi tan bueno como el acceso de lectura al servidor real. (ya que las personas no cambian sus contraseñas con suficiente frecuencia)

Además, una cuenta casi en cualquier lugar (a menos que sea un sitio bancario) no es tan valiosa. Cientos de miles de cuentas, sin embargo, ahora estás hablando. Y si bien una sola escritura de db puede pasar desapercibida, miles de escrituras anómalas de db, especialmente con cada persona en la que se escribió la cuenta ahora no pueden iniciar sesión, generalmente se notarán. Además, al descifrar la contraseña de su usuario se obtiene acceso a todos los lugares en los que el usuario ha utilizado esa combinación de ID / contraseña, lo que probablemente incluya sitios más valiosos que los suyos.

En cuanto a su esquema de almacenamiento de registros, la razón principal para almacenar la salida de su función de hashing de contraseña en un blob que el resto de la base de datos no interpreta (a diferencia de los campos salt y hash ) es que no desea codificar su algoritmo hash en su base de datos. ¿Qué pasaría si mañana quisiera cambiar a PBKDF2, o scrypt, o de hecho bcrypt? Es mejor dejar que una función de hash de contraseña vetada existente realice la interpretación que vincularse con funciones de hash que se ajusten al formato de su método de hash de commodity de sal + actual. En cambio, si solo tiene un campo para algorithm y otro campo que es solo "cadena para pasar al algoritmo junto con una contraseña para ver si la contraseña es buena" (puede llamar a este campo hash o saltNhash ), incluso puede actualizar a los usuarios de forma transparente al iniciar sesión.

Como nota aparte, SHA2 con sal es una seguridad de contraseña aceptable si está estableciendo un servicio web en 1995. Veinte años después, use bcrypt o algo aún mejor . Los hash de productos básicos salados (como MD5 o la familia SHA *) son vulnerables a los ataques basados en GPU económicos, hasta el punto en que las tablas del arco iris ya no son económicamente eficientes: es más económico ejecutar el ataque del diccionario según sea necesario que mantenerlo alrededor de una mesa gigante que es trivialmente derrotada por la salazón de todos modos.

El hash de contraseñas es algo que otras personas ya han elaborado en detalle para usted. No escribirías tu propio cifrado o tu propio algoritmo de compresión de video; no cometa el error de ignorar la buena solución que tiene frente a usted a cambio de años de descubrir casos sutiles de rincones que la gente ya ha diseñado.

    
respondido por el Daniel Martin 19.01.2016 - 02:52
fuente
2

Si utiliza una sal aleatoria suficientemente larga y previene un ataque de precálculo (por ejemplo: tablas de arco iris ), no lo hará. protéjase contra un simple ataque de diccionario en la contraseña. Considere el escenario donde un atacante obtiene una copia de la base de datos. Si las contraseñas son solo SHA2 con sal, puede valer la pena su esfuerzo para ir tras un número de contraseñas. Esto podría hacerse calculando los hashes para las 100 contraseñas más comunes para cada sal que se usa en la base de datos. Alternativamente, si una cuenta está dirigida, el atacante puede realizar un ataque profundo en ese hash. El uso de bcrypt aumenta considerablemente el cálculo, el tiempo y el costo monetario de la ejecución de dicho ataque.

Como señala, el almacenamiento seguro de contraseñas no ayuda si el atacante obtiene acceso de escritura a la tabla de contraseñas oa la base de datos en general. Cuando eso ocurre, el atacante puede usar ataques más directos.

    
respondido por el Neil Smithline 19.01.2016 - 01:51
fuente

Lea otras preguntas en las etiquetas