PBKDF2 y Bcrypt no admiten aumentar el costo, comenzando desde la salida en un recuento de iteraciones dado, sin el conocimiento de la contraseña. No hay una razón intrínseca para eso; un proceso de hashing de contraseña podría permitir dicho estiramiento fuera de línea mientras sigue siendo "bueno". Pero estos algoritmos pasan a no permitirlo.
Lo que se puede hacer es lo siguiente: una salida bcrypt o PBKDF2 normal incluye la sal s , el recuento de iteraciones i y la salida hash v . En las implementaciones de bcrypt, los tres valores a menudo se codifican en caracteres imprimibles (con una codificación similar a Base64); Consulte, por ejemplo, esta respuesta . Suponiendo que tenga s y v , puede almacenar lo siguiente:
- la sal s ;
- un recuento de iteraciones i ;
- una cuenta de iteración extra j ;
- el valor h (h (h (... h (h (v))))) que es el resultado del hashing v repetidamente, con una función hash segura h , realizada j veces.
Para la verificación de la contraseña, tiene que volver a calcular el bcrypt / PBKDF2 a partir de la contraseña dada (usando s y i ), y luego retoque el valor resultante j veces, para ver si coincide con el valor almacenado.
Esto es en su mayoría seguro, si usa una función hash fuerte para h , como SHA-256. Se puede mostrar que el hashing repetido reduce el espacio de valores posibles, pero debe alcanzar un "ciclo" interno de tamaño aproximadamente sqrt (N) si los valores de salida de hash están en un espacio de tamaño N ; además, si ese ciclo es lo suficientemente pequeño como para ser explorado exhaustivamente, entonces se puede calcular una colisión en la función hash h (consulte esta página para un buen diagrama). Por lo tanto, si h es resistente a colisiones (como SHA-256), entonces el esquema anterior es seguro.
El punto importante es que puede aumentar j más tarde, sin conexión. Sin embargo , tenga en cuenta que este tipo de estiramiento se basa en el costo de computación involucrado en la realización de muchos cálculos adicionales de función hash. Desafortunadamente, las funciones hash habituales como SHA-256 se asignan realmente bien a lo que puede hacer la GPU; por lo tanto, la ventaja obtenida de esa manera sobre el atacante podría no ser tan grande como se deseaba inicialmente. En otras palabras, el uso del estiramiento descrito anteriormente invalida cualquier ventaja de bcrypt sobre PBKDF2 (consulte esta respuesta para una discusión sobre este tema). Puede aplicarlo como una medida temporal, hasta que dicho usuario regrese, de modo que el paso bcrypt pueda realizarse nuevamente con un recuento de iteraciones más alto ( i ).
Además , el esquema que describo anteriormente es criptografía casera, y eso es malo. Puedo salirme con la suya porque soy totalmente increíble, pero esto no se puede promover de manera general.