Este es un clon de una pregunta que publiqué en Stack Exchange. Pensé que podría llamar la atención de algunas personas diferentes que podrían ayudar aquí.
Estamos intentando implementar un protocolo de contraseña de una sola vez basado en hmac para usar usuarios que se autentiquen en nuestra API.
La idea es cifrar un identificador único para el usuario (uid) contra una clave privada y un contador incremental. Luego incremente el contador para la siguiente llamada.
encrypt(uid, private_key, counter)
# now increment the counter for the next call
Luego, en el lado del servidor, descifre usando la clave privada y el contador para obtener el identificador de usuario (uid).
decrypt(encrpyted_string, private_key, counter)
# now increment the counter for the next received request
Esto funciona bien. Cada llamada es completamente única (una vez) debido al contador.
Sin embargo, ¿cómo manejaríamos la sincronización del contador? ¿Qué sucede si el cliente genera una solicitud, incrementa el contador para la siguiente llamada y envía la solicitud, pero el servidor está fuera de línea y nunca recibe la solicitud, o si hay un problema de conectividad a Internet y la solicitud nunca se recibe? Ahora el servidor y el cliente no está sincronizado con los contadores del otro.
¿Es este un caso de "debe saber si se ha enviado una solicitud"? Es decir. podríamos agregar un encabezado de respuesta desde el servidor para indicar si el contador se ha incrementado y solo si lo hace, también incrementamos el contador en la aplicación ... pero lo mismo podría decirse al revés: podríamos enviar un La solicitud, el servidor lo recibe, incrementa su propio contador y envía una respuesta, pero la conexión a Internet se ha interrumpido mientras el servidor procesaba su solicitud y la aplicación nunca recibe la respuesta, nunca incrementa su contador y, por lo tanto, los dos no están sincronizados. de nuevo.
Gracias por cualquier información que puedas darme.