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?