¿Qué tan seguro es BCRYPT (SHA1 (Contraseña)) [duplicado]

17

Esta pregunta es una bifurcación de una pregunta anterior aquí: ¿Es seguro / prudente almacenar una sal en el mismo campo que la contraseña con hash?

Suponga que ejecuta un portal web y almacene las contraseñas en hash SHA1. ¿Cómo actualizar esto a hashes BCRYPT en su lugar?

Por lo general, esperarías a que los usuarios inicien sesión y vuelvan a codificar sus contraseñas (del texto sin formato que ingresaron) a BCRYPT. Pero podría pasar un tiempo antes de que todos los usuarios inicien sesión en su plataforma, y siempre habrá usuarios inactivos que nunca volverán.

Una propuesta separada (que escuché por primera vez de Troy Hunt) fue BCRIPTA las contraseñas SHA1 existentes en su base de datos. Efectivamente serías BCRYPT(SHA1(plaintext_password)) . De esta manera, todos los usuarios del sistema se actualizan a BCRYPT a la vez, independientemente de su actividad.

De esta manera, una infracción en su base de datos, no expone a los usuarios que aún no han iniciado sesión y siguen en SHA1.

La pregunta es:

  1. Es BCRYPT(SHA1(plaintext_password)) es equivalente en seguridad a BCRYPT(plaintext_password)
  2. Si no, ¿por qué? ¿Y es la diferencia lo suficientemente razonable como para considerar esta opción?

La pregunta se enfoca en BCRYPT (SHA1), pero podría aplicarse fácilmente a cualquiera de los dos algoritmos hash con el más fuerte aplicado último.

    
pregunta keithRozario 10.04.2018 - 04:56
fuente

2 respuestas

19

En primer lugar, ¡gracias por tomarse el tiempo para determinar cómo hacerlo correctamente y mejorar la seguridad de sus usuarios!

La migración del almacenamiento de contraseñas mientras se tienen en cuenta los hashes heredados es relativamente común .

Para su escenario de migración, bcrypt(base64(sha1(password))) sería un saldo razonable . Evita el problema nulo ( importante - definitivamente no ¡No quiero dejar de lado la etapa base64! ), elude el límite nativo de 72 caracteres de bcrypt y es 100% compatible con sus hashes existentes.

Simplemente, debe codificar todos los SHA1 existentes con bcrypt(base64(sha1)) y luego codificar todas las contraseñas nuevas con la secuencia completa. (También podría usar SHA256 en su lugar, aunque esto aumentaría un poco la complejidad de su código, para verificar si se usó SHA1 o SHA25 (o solo para probarlos y aprobar). A largo plazo, SHA256 sería más resistente a las colisiones. , por lo que sería una mejor opción).

Para la resistencia a la fuerza bruta, esto no solo sería equivalente a bcrypt, sino que sería teóricamente superior (aunque en la práctica, 72 caracteres son tan grandes para el almacenamiento de contraseñas que en realidad son los mismos).

Consejo de bonificación:

  • Asegúrese de usar un factor de trabajo bcrypt que sea lo suficientemente alto como para resistir los ataques sin conexión: el valor más alto que sus usuarios pueden tolerar, 100 ms o más (probablemente al menos un factor de trabajo de 10). Para velocidades inferiores a 1 segundo, bcrypt puede ser más lento para el atacante (mejor para el defensor) que sus reemplazos modernos scrypt y Argon2 (YMMV).
  • Almacene el valor predeterminado para el factor de trabajo como una variable configurable de todo el sistema, de modo que pueda aumentarla periódicamente a medida que las velocidades del hardware subyacente se vuelvan más rápidas (o más distribuidas).
respondido por el Royce Williams 10.04.2018 - 07:19
fuente
4

Esto limitará el espacio de teclas a aproximadamente 2 160 , ya que SHA-1 genera resúmenes de 20 bytes, pero por lo demás está bien. De hecho, bcrypt tiene un límite de entrada de 72 bytes, por lo que no es nada raro que las personas utilicen primero una contraseña utilizando un hash criptográficamente seguro y rápido. Debido a que el límite es mayor que el tamaño de resumen de SHA-1, es posible que desee utilizar un hash con un resumen más grande. Tenga en cuenta que el problema nulo requiere que el resumen se convierta en otra codificación, tal como base64.

Si ya tiene una base de datos llena de hashes SHA-1, es perfectamente correcto ejecutarlos a través de bcrypt.

    
respondido por el forest 10.04.2018 - 05:10
fuente

Lea otras preguntas en las etiquetas