¿Cómo debo elegir un factor de dificultad para la función de hashing de mi contraseña?

10

Suponiendo que hago el hashing de contraseñas correctamente y uso bcrypt, scrypt o PBKDF2, ¿cómo debo elegir un factor de dificultad adecuado? es decir, rondas para bcrypt, iteraciones para PBKDF2 y maxtime, maxmem o maxmemfrac para scrypt.

Supongamos también que ocurrirá el peor de los casos y que los hashes y la sal de mi usuario (y cualquier aplicación de sal o pimienta. Ya sabes ... el peor de los casos .) se filtrarán, ya sea accidental o deliberadamente.

Necesito elegir un valor que sea:

  1. Lo suficientemente fácil para mí.
  2. Demasiado difícil para un atacante.

La primera parte es relativamente fácil. Si elijo suficientes rondas para hacer que bcrypt tarde 0.5 segundos, puedo estar seguro de que mis usuarios no verán una desaceleración significativa cuando inicien sesión. (De todos modos, en una aplicación web, 0,5 segundos no es mucho tiempo). También sé, probando un bucle sobre esa función, que puedo manejar muchos más inicios de sesión por minuto de los que veo actualmente. Si la tasa de inicio de sesión que recibo aumenta, puedo reducir el número de rondas y migrar a los usuarios a medida que cada uno inicia sesión o puedo esperar por un hardware mejor y más barato. Cuando naturalmente mejoro, el hardware más barato en mi ciclo de actualización puedo aumentar las rondas para compensar.

La pregunta que es más difícil de responder es qué tan difícil es demasiado difícil para un atacante. Por supuesto, depende del valor de las contraseñas para un atacante en particular, pero para esta pregunta, no asuma ningún valor especial más allá del hecho de que la mayoría de estas combinaciones de usuario / contraseña funcionarán en otros sitios que realmente tienen valor.

Si cambio el número de rondas bcrypt para que ahora tome 0.01 segundos en lugar de 0.5, ¿ha cambiado la ecuación para el atacante de modo que la contraseña forzada bruta ahora vale más que el costo de forzarla? ¿Cómo puedo saber si tiene o no?

Parece que esto es bastante fácil de calcular basándose en lo siguiente:

  1. ¿Cuánto vale un par de nombre de usuario / contraseña genérico?
  2. cuánto cuesta forzar con fuerza bruta un hash de $ hash_function con $ dificultad_factor.

Dado que scrypt fue diseñado para ser duro en memoria en lugar de duro para CPU, la respuesta a 2. variará de manera diferente según el algoritmo. No es una aceleración lineal ya que las velocidades de CPU / GPU aumentan o los precios de RAM disminuyen.

¿Hay algún lugar donde pueda encontrar la información anterior que se actualiza a medida que se dispone de nuevo hardware?

El mejor recurso que he encontrado hasta ahora para el valor de una contraseña son las publicaciones de blog de Brian Krebs, como this y this . Para los hashes agrietados por segundo, es el "Crack me si puedes" concurso en DEFCON . Hash agrietado por dólar sería bueno.

Por favor ignore en sus respuestas cualquier falla algorítmica en estos algoritmos. Si se encuentra uno de esos, simplemente cambiaría a uno de los otros algoritmos alternativos. Supongo que si se encuentra una falla en cualquiera de estos, estará en todas las noticias de seguridad.

Acabo de encontrar en Crypto.SE esta tabla de papel que define scrypt :

Todo lo que necesito es que esa tabla se actualice cada año.

    
pregunta Ladadadada 21.06.2012 - 14:35
fuente

3 respuestas

6

Desafortunadamente, la amplia variedad de hardware impide la creación de tablas como la que usted desea, a menos que primero realice un estudio de todas las arquitecturas de hardware existentes y las mejores implementaciones de bcrypt / scrypt / PBKDF2 para esa arquitectura. Incluso la tabla en el artículo de scrypt no es lo que quieres: no te dice cuánto costaría para un atacante; indica cuánto costaría para un atacante con el hardware y el software que el diseñador scrypt pensó al escribir el artículo .

Estas estimaciones no se escalan bien, por cierto. Si fuera un atacante que enfrentara un costo de ataque estimado en 10 billones de dólares con el hardware disponible, primero invertiría mil millones de dólares en la construcción de un sistema personalizado basado en ASIC que sería más rápido para ese trabajo. Una PC es buena para hacer accesos pseudoaleatorios a la RAM, pero no es el mejor hardware para eso, aunque solo sea porque hay muchos otros componentes en una PC, que son inútiles. para un ataque.

Al menos, para PBKDF2, dado que los cálculos se asignan a la función de hash subyacente sin problemas de acceso a la memoria, puede usar los puntos de referencia de la función de hash existente para obtener una idea (por ejemplo, estas ).

Dicho esto, no todo está perdido. No obtendrás estimaciones precisas de los costos de ataque, pero eso no significa que todo lo que puedes hacer es lamentarte, encogerte y morir. Un primer método pragmático es configurar el recuento de iteraciones tan alto como pueda : configúrelo en el valor más alto que no haga que el proceso de inicio de sesión normal sea intolerablemente lento. De esa manera, no sabrá si su seguridad es buena , pero será lo mejor que pueda . Que es un consuelo.

El resto del trabajo estará del lado de los usuarios. Después de todo, el factor de dificultad en el hash de la contraseña está ahí para contrarrestar la ley de Moore. Sin embargo, en el mejor de los casos, es una coincidencia entre la entropía de contraseña y la paciencia del atacante :

  • La ventaja del atacante es que es más rico, puede comprar hardware dedicado y es paciente : puede gastar una hora, tal vez un día en descifrar una contraseña de alto valor; mientras que el usuario no tolerará esperar más de un segundo al iniciar sesión.
  • La ventaja del defensor es la entropía de contraseña .

Contabilizando un factor de eficiencia de 1000 para el atacante (hardware dedicado, más dólares arrojados a él) y un factor de paciencia de 86400 (el atacante desea tener éxito en un día, el usuario no esperará más de un segundo), luego, la entropía de la contraseña debe exceder los 86 millones (es decir, un poco más de 26 bits) si el defensor debe ganar el juego. Para aumentar la contraseña de la entropía, solo hay una manera: educar, educar y educar nuevamente. No intente hacer cumplir las "reglas de contraseña", se oponen a los usuarios en lugar de crear contraseñas seguras. En su lugar, proporcione un botón generador de contraseña no obligatorio , que produce contraseñas con, por ejemplo, 40 bits de entropía, y explique a los usuarios que usar el botón sería una muy buena idea.

    
respondido por el Thomas Pornin 20.01.2013 - 23:40
fuente
1

Al utilizar su hardware de destino, seleccionaría un costo que haga que el algoritmo tome aproximadamente 1/10 de segundo. Implementar un retraso después de los intentos fallidos de inicio de sesión. No será rentable forzar con fuerza cualquier contraseña que no haya sido mal escogida (por ejemplo, el nombre de usuario, el nombre del sitio, la "contraseña"). El valor real que elija dependerá de su hardware de destino.

    
respondido por el Steven Alexander 26.06.2012 - 02:10
fuente
0
  1. la velocidad del algoritmo no importa si las contraseñas son débiles.
  2. si la contraseña está en un diccionario, estás casi jodido instantáneamente
  3. si la contraseña es generada por una regla que se incluye con JtR o Hashcat, un poco más tarde se equivocó;)

Aparte de eso, ¿cuántos usuarios / contraseñas almacena? Si solo está protegiendo una cuenta (piense en un servidor con solo la cuenta raíz en ella), entonces el uso de sal es discutible.

¿Con qué frecuencia se ve obligado a cambiar las contraseñas? Si la dificultad de la contraseña forzará al atacante a formar un conjunto completo de caracteres, una contraseña de fuerza bruta larga, entonces puede hacer una aproximación decente: NumberOfCombos / CrackSpeed = TimeToCrack

Por lo tanto, si tiene un ASCII imprimible completamente al azar de 6 caracteres (95 símbolos) que puede descifrar a 100 por segundo, entonces tiene 95 ^ 6/100 = 233 años para romper todo el espacio de teclas.

Sin embargo, si está usando algo que es rápido (mi GPU agrieta una sola ronda, MD5 sin sal a 8 mil millones / s), y le lanza un hardware decente, entonces puede romper todo el espacio de teclas de 6 caracteres. en unos 90 segundos. Ir a la longitud 7 en el mismo juego de caracteres extiende el tiempo hasta la grieta a > 2hrs, y la duración 8 lo extiende a 9 días. Entonces, si cambias tus contraseñas cada 90 días, eso le da al atacante suficiente tiempo para descifrar y usar esa longitud 8, la contraseña del conjunto de caracteres 95.

La regla es simple: cuanto más grande sea el conjunto de caracteres y más larga sea la contraseña, el espacio de las teclas crecerá a una velocidad ridícula. El hardware y el software modernos hacen que el craqueo sea muy rápido, pero puede mitigar la amenaza con sales / algos. El verdadero asesino es cuando no forzaste al atacante en un escenario de fuerza bruta. Los diccionarios / reglas / permutaciones / ataques de combinación de múltiples palabras son extremadamente eficientes para encontrar contraseñas no aleatorias.

    
respondido por el Marcin 21.06.2012 - 16:39
fuente

Lea otras preguntas en las etiquetas