El primero utiliza tokens CSRF generados aleatoriamente, que utiliza un generador criptográfico aleatorio fuerte para generar el token.
Esto es ideal. En este caso, el token es un bloque opaco absolutamente impredecible sin importancia fuera del contexto previsto.
La segunda implementación que encontré usa HMAC que cifra el ID de sesión con
clave secreta almacenada en la configuración del lado del servidor.
Esto es más sencillo de implementar. Es de suponer que los ID de sesión ya se están generando, por lo que no es necesario persistir nada adicional. Dado que no es necesario un almacenamiento adicional, podría ser que este mecanismo se pueda implementar en situaciones donde un token aleatorio no se pueda trabajar en un diseño heredado. Esta es una solución relativamente elegante. Suponiendo que la clave secreta no sea conocida por el atacante, el token no debería ser reproducible fuera del servidor.
La tercera implementación que vi usa una combinación de ambos, una clave secreta almacenada en la configuración del lado del servidor se usa para HMAC un valor generado aleatoriamente
Esto es un poco tonto. Presumiblemente impulsado por el hecho de que un HMAC es un concepto relacionado con la seguridad, el autor intenta agregar seguridad a su diseño al incluir algo relacionado con la seguridad. Una especie de mágico talismán de seguridad. Es de suponer que no es peor que usar el número aleatorio solo, pero ciertamente no es mejor. A menos que cuente la cálida sensación borrosa que obtiene al usar HMAC en su implementación de seguridad.
Es es , sin embargo, es una solución alternativa si tiene un RNG deficiente, aunque en ese caso probablemente mezclaría el ID de sesión o algo similar antes de hacer hash para que pueda Garantizado que el número que hash es único.