El Play Framework para Scala tiene soporte para cookies de sesión firmadas. En el archivo de configuración de la aplicación hay un "secreto de aplicación" que se establece como un número aleatorio seguro cuando se inicializa el código fuente de la aplicación. Este secreto se comparte entre varias copias de la aplicación que se ejecuta en una granja de servidores web para que todas las firmas de cookies puedan verificarse en cualquier servidor.
Cuando se crea una sesión en Play, la sesión se firma automáticamente con el secreto de la aplicación y HMAC-SHA1.
Me preocupa que el mismo secreto de aplicación se use durante la vida de la aplicación. ¿Es válida esta preocupación?
Estaba tratando de encontrar una mejor manera de firmar las cookies, pero conozco el adagio de inventar tus propias técnicas criptográficas.
¿Hay alguna forma aceptada de que todos los servidores compartan un secreto cambiante?
Pensé en lo siguiente (tenga en cuenta que todas las cookies de sesión solo están en la memoria y caducan cuando se cierra el navegador):
- Incruste la fecha de firma (UTC) en cada cookie.
- La clave de firma se genera aleatoriamente en la primera firma del día (después de la medianoche) y se almacena en la base de datos para que todos los servidores la compartan.
- Cuando un servidor necesita firmar una cookie, comprueba su propia clave de firma y la fecha en que se generó y compara esa fecha con la fecha actual.
- Si la fecha de firma es la misma que la fecha actual, la clave se utiliza para firmar la cookie.
- Si la fecha de firma es anterior a la fecha actual, el servidor verifica la base de datos en busca de una nueva clave de firma con la fecha actual.
- Si existe una clave con la fecha actual en la base de datos, se usa para firmar la nueva cookie. Las claves de firma antiguas se conservan (durante un cierto número de días) para verificar las cookies más antiguas.
- Si no hay una clave para la fecha actual, se genera una nueva (¿cómo manejo múltiples servidores haciendo esto al mismo tiempo en una base de datos NoSQL?).
Como un algoritmo alternativo, puedo generar un nuevo secreto cada día usando HMAC (secreto de la aplicación, fecha actual). Con esto, no necesito almacenar las claves secretas diarias en la base de datos, ya que todos los servidores pueden generar la misma secuencia diaria de claves. No estoy seguro de si esto es más seguro (o menos) que almacenar la clave diaria en la base de datos. Necesito proteger el secreto de la aplicación, pero no más de lo que necesito proteger la base de datos. Se recomienda que el secreto de la aplicación no se almacene en el control de origen, sino que se cargue desde una variable de entorno establecida en cada servidor de producción.