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:
- Lo suficientemente fácil para mí.
- 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:
- ¿Cuánto vale un par de nombre de usuario / contraseña genérico?
- 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.