¿Puedo hash inicialmente las contraseñas con SHA en lugar de hacerlas con bcrypt para desacoplar las solicitudes de las funciones de cifrado lento?

2

Estoy usando bcrypt para algunas solicitudes de servicio web que contienen varias contraseñas. El problema es que estas solicitudes de servicio web pueden tardar unos minutos en completarse debido a bcrypt. No es muy fácil de usar.

Mi pregunta es la siguiente: ¿Puedo hashear estas contraseñas con SHA y guardarlas en la base de datos, luego hacer que venga un trabajador en cola desacoplado y hash correctamente estas contraseñas con bcrypt?

De esta manera, eventualmente, estas contraseñas se procesarán con bcrypt pero el usuario no tendrá una experiencia dolorosa en el proceso.

Actualmente, estoy usando la biblioteca .NET BCrypt.Net.

    
pregunta ElectricSignal 05.05.2015 - 19:16
fuente

3 respuestas

6

Bcrypt se ejecuta muchas veces para desacelerarlo intencionalmente. ¿Quizás necesita ajustar el número de rondas de bcrypt que está ejecutando? Esta respuesta tiene alguna información al respecto.

Si bien lo que usted propone puede funcionar, no puedo decir que implementar una variante del manejo de contraseñas estándar sea una buena idea. Si bien tengo inquietudes específicas, como el hash SHA que permanece en la base de datos por demasiado tiempo y la seguridad de la cola encriptada, generalmente no veo la necesidad de variar de la norma. Si tarda demasiado, reduzca el número de rondas utilizadas para la ejecución. Si es inexplicablemente lento, averigüe por qué. No solo decida que puede hacerlo mejor que décadas de mejores prácticas de seguridad. No es probable que salga bien.

Quizás desee publicar otra pregunta (probablemente en StackOverflow ) preguntando sobre ayuda para encontrar el problema de rendimiento. Eso parece una idea mucho mejor.

Lo siento, no puedo estar de acuerdo con tu propuesta ...

    
respondido por el Neil Smithline 05.05.2015 - 19:39
fuente
3

El diseño representado socavaría por completo la seguridad de bcrypt.

Su diseño podría simplificarse simplemente eliminando la parte bcrypt del flujo y confiando solo en el hash SHA. Esa simplificación no cambiaría significativamente la seguridad del diseño, aún sería tan inseguro como la simple aplicación de un hash SHA.

Sin embargo, usar un hash SHA con un salt sería suficiente para proteger las buenas contraseñas. Solo las contraseñas débiles se benefician del uso de hashing de contraseña más fuerte.

No ha descrito completamente el problema que está tratando de resolver, por lo que no podemos proporcionarle ningún consejo sólido sobre cómo proceder. Sin embargo, me vienen a la mente dos interpretaciones de su pregunta, y cada una de ellas puede ser respondida.

¿Está intentando acelerar la creación masiva de usuarios?

Si está intentando acelerar la creación masiva de nuevos usuarios y el algoritmo de hash de contraseña lo ralentiza, entonces puedo proponer dos formas de mejorar ese caso de uso bastante específico.

  1. Use contraseñas seguras y un hash de contraseña mediocre. Si las contraseñas que genera para los usuarios inicialmente son seguras, entonces no necesita la seguridad completa de bcrypt. Una contraseña inicial con 128 bits de entropía pasado a través de un hash de contraseña que realiza una única iteración con sal de SHA-2 es lo suficientemente segura. Una vez que el usuario cambia la contraseña inicial a otra cosa, puede cambiar a un algoritmo de hashing de contraseña diferente. Esto incluso puede lograrse utilizando formatos estándar para hashes de contraseña, como el que una vez usó la función crypt , en el que el formato comienza con una especificación del hash utilizado.
  2. Use un hash de contraseña que admita el hash inicial rápido, pero es más lento para verificar las contraseñas. Esto se puede lograr aplicando un hash SHA-2 a la concatenación de sal, contraseña y una cadena de bits aleatoria corta. La cadena de bits aleatoria no se almacena de todos modos, por lo que tiene que ser forzada brutalmente para verificar una contraseña. Esta fuerza bruta reemplaza la iteración habitual utilizada en los hashes de contraseña.

¿Está intentando reducir la carga de CPU en su servidor?

Hay algoritmos de hashing de contraseñas que pueden descargar de forma segura la parte de cómputo que requiere la CPU al cliente sin comprometer la seguridad. Esto puede incluso mejorar la seguridad al no permitir que el servidor vea la contraseña real. El inconveniente de este enfoque es que requiere soporte del lado del cliente. Un cliente ya no puede enviar el nombre de usuario y la contraseña para iniciar sesión.

¿Qué hash utilizar?

No use nada más débil que SHA-2 en ningún sistema nuevo. Cualquier sistema heredado que use SHA-1 para el uso relacionado con la seguridad debe ser eliminado o actualizado. Cualquier sistema heredado que use MD5 para fines relacionados con la seguridad debería haberse eliminado hace una década.

La familia SHA-2 tiene seis variantes diferentes. No vayas con una salida más corta porque crees que será más rápido. En realidad, solo hay dos variantes de la función de compresión. Uno tiene un estado interno de 256 bits y está optimizado para CPU de 32 bits. El otro tiene un estado interno de 512 bits y está optimizado para CPU de 64 bits. Si su CPU es de 64 bits, entonces SHA-512 es tanto el más rápido como el más seguro.

Para el hashing de contraseñas, nunca se debe hash sin salt. Creo que ese es el único consejo completamente objetivo que se puede dar sobre la forma de hash de contraseñas. Hay muchos otros consejos que dar, pero el resto dependerá del escenario de amenaza.

    
respondido por el kasperd 06.05.2015 - 12:35
fuente
2

El riesgo aquí es que si un atacante logra extraer las contraseñas SHA de la base de datos, puede ejecutar un ataque de adivinación de contraseñas a una velocidad relativamente rápida. Debería al menos incluir estas contraseñas, pero luego está aumentando la complejidad, lo que generalmente está reñido con la seguridad. Un buen sistema seguro debe ser lo más simple posible para que así sea.

No creo que bcrypt(sha-2(password)) reduzca seguridad de cualquier manera significativa . Sí, podría estar reduciendo el espacio de búsqueda de 576 bits a 256 (con SHA-256), sin embargo, solo necesita 128 bits de entropía para tener una contraseña "irrompible" con la tecnología de hoy (y la del futuro previsible). Así que este es un punto discutible.

No olvide que para validar las contraseñas para el inicio de sesión tendrá que usar SHA-2 (rápido) y luego cifrarlo (lento) cada vez para realizar una comparación. Por lo tanto, su registro en el sistema será lento, aunque aquí está haciendo bcrypt en lugar de n * bcrypt , que creo que su problema está en el proceso por lotes.

Creo que la solución a esto es un problema de arquitectura del sistema en lugar de un problema de seguridad. Ajuste el costo de su bcrypt para que el usuario válido tarde aproximadamente 1 segundo en iniciar sesión. Luego, rediseñe el proceso por lotes para que sea asíncrono y cifre las contraseñas en segundo plano. Tenga un evento de notificación para devolver si este proceso fue exitoso o no, y si no, qué ID de usuarios tuvieron fallas. Esto mejorará su experiencia de usuario, haciendo que su sistema sea menos seguro no. La memoria es mucho más segura que la base de datos.

    
respondido por el SilverlightFox 06.05.2015 - 11:12
fuente

Lea otras preguntas en las etiquetas