Respuesta corta: si compara las velocidades en x86, el costo máximo en PHP de 31 (2 ^ 31 iteraciones) sería lo suficientemente seguro para una contraseña segura (aleatoria de 8 caracteres) . No es que se pueda utilizar, un hash tardaría aproximadamente 200 horas en generarse en un escritorio.
Respuesta larga:
(gran margen de error debido a la falta de datos de rendimiento de hash precisos, no hay datos específicos sobre la seguridad de la contraseña y la aproximación perezosa).
El costo de la fuerza bruta en bruto puede variar con un factor de miles de millones entre una contraseña de 6 letras y una contraseña de longitud 10 con números y caracteres especiales. (26 ^ 6 = 3.0E + 8 para minúsculas, 94 ^ 10 = 5.3e + 19 para mixalpha-num-all) Las velocidades de hash pueden variar con la implementación.
Entonces, si el usuario elige una de las 1000 contraseñas más utilizadas, es tan bueno como un número de pin de 3 dígitos, lo que hace que la pregunta sea prácticamente irrelevante.
Para este fin, la respuesta es "tanto como puedas, no podemos salvar a todos de ellos mismos"
Pero hagamos un cálculo de la parte de atrás de la servilleta para tener una idea. Supongamos que la base de datos establece un requisito mínimo fuerte de "tan solo 8 caracteres aleatorios"
Con un conjunto de caracteres de todos los caracteres ASCII en minúsculas y mayúsculas, todos los dígitos y caracteres especiales que vendrían a 6161234432565770 combinaciones
Ahora vamos a tener una idea del rendimiento de los hashes. La única comparación de lado a lado que pude encontrar fue la siguiente:
enlace
Indica que el factor de trabajo predeterminado de 10 es aproximadamente igual a 80.000 rondas de SHA512crypt
.
Ahora SHA 512 solo cuesta alrededor del 120% del tiempo 256 tomas
Eso hace que bcrypt con costo (10) sea aproximadamente igual a 100.000 rondas de SHA256.
El costo de BCrypt se define así:
El parámetro de costo de dos dígitos es el logaritmo base-2 de la iteración
cuente para el algoritmo de hashing basado en Blowfish y debe ser
en el rango 04-31, los valores fuera de este rango causarán que crypt () falle
costo (10) = 2 ^ 10 = 1024 iteraciones. por lo tanto, el algoritmo SHA256 de bitcoin es aproximadamente 100 veces más rápido por iteración.
Asumiendo que la red BitCoins puede hacer 2.14E + 18 SHA256 / segundo, se reduciría a 2.14E + 16 iteraciones de BCrypt / segundo.
El espacio de teclas de la contraseña aleatoria de longitud 8 en el conjunto de caracteres mixalpha-numeric-all es aproximadamente 6.16E + 16
- Por lo tanto, en una iteración, podría imponer una fuerza bruta en dicha contraseña en < 3s. el mínimo para PHP es un costo de 4, así que 16 iteraciones.
- Al costo predeterminado de 10, llevaría casi una hora.
-
Al costo máximo de 31 aumentaría otros 2 ^ 21 = 2097152.
Eso se reduciría a > 200 años. (2097152 horas es un poco menos de 240 años. )
Esta es una fuerza bruta bastante inviable, y por el momento podría considerarse segura.
La cantidad máxima de 'costo' en BCrypt sería suficiente contra toda la red actual de BitCoin si la contraseña es moderadamente fuerte.
Sin embargo, la comparación de BCrypt con SHA512 menciona el costo (20) ya toma > 3 minutos en una estación de trabajo, por lo que los grandes costos no son prácticos por ahora.
extrapolando 2 ^ 12 * 3.12 / 60 = ~ 213 horas