Fondo
Estoy configurando una API que se utilizará principalmente a través de HTTPS (solo las llamadas que no necesiten seguridad alguna, por lo tanto, están disponibles a través de HTTP). Algunos aspectos de la misma deben ser accedidos solo por usuarios autenticados. Para permitir esto sin usar contraseñas, cada usuario posee uno o más pares de llaves RSA. La clave pública se mantiene en el servidor API.
Cuando el usuario desea autenticarse, firma la marca de hora actual con su clave privada y la envía, la marca de hora y una identificación de qué par de llaves se usó en el servidor.
El servidor verifica que el mensaje (la marca de tiempo) fue firmado por un usuario con la clave correspondiente.
El servidor verifica que la marca de tiempo no ha superado una cierta cantidad de tiempo y devuelve un token JWT firmado con la clave privada del servidor que se usará más adelante para autenticar al usuario.
Preocupaciones
La marca de tiempo (que actúa como un nounce (?) y una forma de restringir el acceso de acuerdo con el tiempo) no debe enviarse junto con la solicitud de autenticación al servidor, ya que, al saber qué mensaje se firmó, la clave podría diseñarse a la inversa.
Un usuario no cauteloso podría perder una clave firmada que prácticamente sería tan malo como perder una contraseña, si no peor.
Pregunta
¿Es incorrecto proporcionar qué "nonce" se firmó junto con la solicitud o si el servidor ya "sabe" (a través de algún intercambio anterior)?
¿Usar la marca de tiempo como un mensaje al crear los compendios falsos de la derrota de la firma? Es decir. ¿Es suficiente hacer que el compendio quede inutilizable después del tiempo vencido, ya que el mensaje no se puede modificar sin pasar una verificación?