Actualmente estoy desarrollando un pequeño proyecto en PHP, y como involucra la autenticación de usuarios, he estado investigando qué opciones tengo con respecto al hashing. Me decidí por PBKDF2 principalmente debido a su naturaleza iterativa, flexibilidad con algoritmos hash y extensibilidad.
Lo que he estado leyendo es que 8ms (o 0.008 segundos) es una meta para generar un hash. ¿Por qué es este valor específico el objetivo? Entiendo el razonamiento detrás de hacer que tome más tiempo generar un hash, pero ¿por qué 8ms específicamente? Es simplemente un buen valor equilibrado entre el tiempo empleado y la seguridad, ¿o existe una razón más específica?
Teórico
Supongamos que tengo un servidor que puede hacer 6400 iteraciones con SHA256 con una longitud de clave de 6 caracteres, con una sal que tiene X caracteres de longitud y una contraseña que tiene Y caracteres de longitud en poco menos de 9 ms. No estoy seguro de si es 'el miedo' el que me ha inculcado, pero no lo considero suficiente principalmente por el bajo número de iteraciones y la longitud de la clave extremadamente corta, a pesar de estar saturada de salsas con lo que es para todos los intentos. Propone un algoritmo seguro. Lo que es 9ms en mi sistema será significativamente menor en un sistema dedicado a "romper" el hash. Una vez más, estos valores son simplemente teóricos, no los analices demasiado.
Entonces, asumamos que voy a 64000 iteraciones con una longitud de clave de 60. Esto toma casi 90 ms para calcular, y lo considero seguro para todos los propósitos, tanto debido a su alto número de iteraciones, como a la clave de salida la longitud y el tiempo que lleva generarla.
Más concretamente, tomaría 10 veces más calcular el último hash (comparado con el primero) independientemente del sistema en el que se esté calculando, a pesar de que es ~ 91% más largo que la "regla de 8 ms" cuando se ejecuta en el entorno original.
Entonces, ¿de dónde vino originalmente este valor de 8 ms y por qué motivos se recomienda exactamente? ¿Los 8ms se basan en el tiempo de cálculo de su entorno, o se calculan por otros medios (por ejemplo, a través de una aplicación hash dedicada que se ejecuta en una GPU)?