estoy intentando asegurar una conexión entre un dispositivo móvil (cliente) mediante una aplicación web y un dispositivo doméstico (servidor) en una red Wifi potencialmente insegura.
La comunicación es asíncrona y estoy tratando de evitar " ataques de repetición ".
Estaba pensando en la Respuesta de desafío, pero la sobrecarga de " pedir desafío, recibir desafío, enviar mensaje con desafío resuelto " es un problema de rendimiento para nosotros.
Así que estaba pensando en utilizar algún tipo de TAN El enfoque del libro, como el horneado en línea, lo hace:
Inicialmente, el Cliente solicitaría un conjunto de Desafíos que almacena. El Servidor almacenará esos Desafíos y hará un seguimiento de cuántos ya se están utilizando.
Si solo quedan n Desafíos, el Servidor crea nuevos Desafíos y los envía con la siguiente respuesta al Cliente. De esta manera, el Cliente casi siempre debería tener suficientes Desafíos sin la sobrecarga de Preguntarlos primero antes de cada solicitud.
Ejemplo:
- El cliente desea iniciar sesión y solicita los desafíos primero, dando su nombre de usuario / ID de usuario.
- El servidor crea n Desafíos y los almacena para el ID de usuario dado, luego los envía al usuario.
- El cliente envía la identificación de desafío y el hash (desafío, secreto compartido).
- El servidor compara el desafío almacenado (identificado por challenge-id) con secreto compartido y, si es correcto, devuelve el éxito y elimina el desafío desde que se usó.
entonces se vuelve más fácil
- El cliente desea llamar a API Endpoint X en el servidor, envía una solicitud con encabezados agregados (challenge-id, hash (challenge, shared-secret))
- El servidor comprueba el desafío y el éxito de uppon lo elimina, ejecuta el método x y devuelve la respuesta. En respuesta, agrega un nuevo desafío en el encabezado ( es decir, challenge_id-xyz: 45egrgh3gw43gw43zrezh54egh44zg54b54esb ... 54sreh5j )
si el cliente tiene pocos desafíos
- El cliente desea llamar a API Point X, envía una solicitud con desafío en el encabezado
- El servidor revisa el Desafío, luego de que lo elimina, se da cuenta de que el cliente tiene pocos desafíos (debido a la baja cantidad de desafíos almacenados) y crea otros nuevos. Envía Response for API Point X y agrega nuevos desafíos en los encabezados.
¿Ya existe un concepto como este y, si no, suena muy parecido a " hornear tu propio cripto " o suena legítimo? ¿O hay una mejor manera de hacerlo sin una gran sobrecarga de http?