Parámetros en la salida de la función de hashing de contraseña

1

Una serie de funciones de cifrado incluyen sus parámetros de ajuste en la salida. Por ejemplo, SCrypt, que he estado considerando para una aplicación que estoy creando, da como resultado el siguiente formato:

$<version>$<params>$<salt>$<hash>

Me parece que si un atacante no conociera estos valores, les haría la vida más difícil ... pero si mi aplicación no conoce los valores, entonces las cosas son difíciles para mí y para mis usuarios. . Entiendo que muchas implementaciones luego continúan con el hash de esta salida para ocultar los parámetros; Supongo que, por lo tanto, hay una forma de hacerlo que no debilita el esquema general ni aumenta las posibilidades de colisiones. Sin embargo, según tengo entendido, si este segundo paso de hash es reversible, entonces tiene un uso limitado porque un atacante puede revertirlo tan fácilmente como podamos y obtener los parámetros que intentamos ocultar de ellos, y si no es reversible, entonces Sigo teniendo el problema de que los parámetros también son inaccesibles para nosotros, así que no veo qué tan diferente es simplemente cortar los parámetros. Por supuesto, siempre podría tener los parámetros como constantes en el código de la aplicación, pero eso depende de la calidad de la ofuscación de mi código, que es algo en lo que nunca he estado tan seguro (llamémoslo paranoia saludable). También significa que no pude migrar a los usuarios de las versiones anteriores sin perder sus contraseñas y cualquier otra cosa que haya cifrado, y configurar la lógica para usar los métodos antiguos y nuevos en paralelo me parece tener dos puertas en lugar de una, lo que se siente menos seguro.

¿Realmente es necesario proteger estos parámetros de los atacantes? En caso afirmativo, ¿cuál es la forma más segura de hacerlo?

    
pregunta anaximander 25.03.2013 - 18:16
fuente

1 respuesta

1

Los "parámetros" no necesitan ser secretos. No están destinados a ser secretos. Es difícil mantenerlos en secreto. Así que, respuesta corta: no te molestes.

En general, no desea mostrar la salida de hash a cualquiera. Es por eso que, en los sistemas Linux, /etc/shadow no es legible en todo el mundo. Del mismo modo, usted no cede un volcado de la base de datos de su sitio web a nadie. Sin embargo, puede haber contratiempos ocasionales, en los cuales el atacante puede aprender parte o la totalidad de los datos de su sistema. Mantiene la contraseña hashes , en lugar de solo las contraseñas, precisamente por esa razón. La aplicación de contraseñas es una "defensa en profundidad". Separar, por ejemplo, la sal del hash es entonces una "defensa más profunda": tiene sentido solo si se asume que el atacante rompió las defensas externas (podría echar un vistazo a la base de datos de su sitio, por ejemplo, con una inyección SQL). ataque) pero no pudo romperlos totalmente (de alguna manera obtuvo un volcado de base de datos parcial , que incluye los valores de hash pero no las sales, o viceversa). Este no es un escenario muy probable, por lo que rara vez vale la pena el esfuerzo.

Consulte esta respuesta para una discusión detallada (en particular, las secciones sobre "Secreto de la sal" y "Pimienta"). ).

    
respondido por el Thomas Pornin 25.03.2013 - 18:32
fuente

Lea otras preguntas en las etiquetas