No quiero ser franco, pero a medida que inventas tu propio algoritmo de autenticación, es casi seguro que lo estropearás y estará sujeto a muchos tipos de ataques. Le sugiero encarecidamente que estudie los trabajos de investigación disponibles y los algoritmos de autenticación criptográfica conocidos antes de crear los suyos para que sepa qué errores no cometer. Comience con la autenticación Kerberos, luego con Zero Knowledge Proofs, luego SSL / PKI.
Dicho esto, para responder a su pregunta, tanto el cliente como el servidor deben generar datos que probablemente se utilicen (o garanticen) para su ventana de tiempo. Los nonces deben usarse una vez (número una vez). Un número aleatorio suficientemente grande sirve para ese propósito y no necesita ser almacenado. Hacer que el cliente y el servidor generen un nonce (2 nonces diferentes) significa que ambos reducen la posibilidad de un ataque de repetición desde el otro lado.
Además, no desea que su servidor de autenticación se convierta en un Oracle (ayude a un cliente atacante con contraseñas de usuario que adivina) o que un servidor falsificado rompa las contraseñas de usuario (engañe a un cliente para que revele su contraseña), por lo que debe ser Cuidado con cómo diseñas tu algoritmo. El número mínimo de pasos necesarios para un algoritmo de autenticación es cuatro .
- c-s: hola, soy cliente + nonce_c.
- s-c: client-challenge + nonce_s.
- c-s: cliente-respuesta + desafío del servidor.
- respuesta del servidor.
¿Ves el algoritmo anterior? El cliente dice quién es (Paso 1), que incluye el nonce del cliente, luego (el Paso 2) el servidor le pide al cliente que demuestre algo que el servidor generó usando el nonce del cliente, un autenticador del cliente almacenado (hash de contraseña, por ejemplo) y un servidor generado mientras tanto. El paso 3 prueba el cliente al servidor. El paso 4 (que la mayoría de la gente olvida) prueba el servidor al cliente; un paso importante para proteger a sus clientes de ataques de servidores falsificados (man in the middle y dns spoofing).
Con este tipo de algoritmo, no necesita almacenar nonces o preocuparse por reutilizarlos en una ventana de tiempo. En su lugar, hágalos lo suficientemente grandes y aleatorios: juntos, el cliente y el servidor participan en la creación de un nonce con propiedades suficientemente seguras.