¿Cómo puedo validar que los datos sensibles al tiempo provienen de una aplicación móvil y no se falsifican?

4

En nuestra aplicación, un usuario selecciona las respuestas a las preguntas. Su puntaje se basa en el tiempo dedicado a responder cada pregunta hasta una décima de segundo. El servidor es responsable de calcular y almacenar el puntaje, pero obviamente no puede registrar el tiempo exacto empleado debido a la latencia.

De alguna manera, la aplicación móvil tendrá que enviar al servidor el tiempo que tardaron en responder la pregunta según su propio reloj. ¿Cómo verifico que el valor en esa llamada a la API no se está falsificando?

Pienso que al menos, podemos tener una cadena que está codificada en ambas aplicaciones que cifrarán / descifrarán las marcas de tiempo (¿AES es bueno para esto?) pero esto no es 100% seguro ya que alguien podría lograrlo esa cadena a través de la descompilación o lo que sea.

Luego de eso, creo que podríamos medir la latencia en una solicitud de prueba cuando nos comunicamos por primera vez con la aplicación móvil. Entonces podemos asegurarnos de que los tiempos de envío estén dentro de una ventana razonable en función de esa latencia. Para mí, esto parece un poco meticuloso e inexacto. Sería difícil decidir cuál sería la ventana ya que los valores son muy pequeños. Por ejemplo, si tomó "5s" para responder una pregunta con ~ 200 ms de latencia, ¿está la ventana 6? 7? 10? Si la ventana es demasiado grande, la falsificación todavía valdría la pena. Demasiado pequeño y podría arruinar a los usuarios legítimos que solo tuvieron un segundo de retraso o lo que sea.

¿Hay alguna solución robusta? ¿El cifrado / descifrado sería "lo suficientemente seguro"?

    
pregunta Logan Serman 01.05.2014 - 01:38
fuente

2 respuestas

2

Como otros han señalado, nunca puedes confiar en el cliente , nunca. Puede hacer que sea difícil para las personas, pero siempre habrá ataques que puedan realizar:

  • Infla artificialmente la medida del tiempo de ida y vuelta (RTT)
  • Extraer claves de cifrado
  • Alterar relojes locales

El monitoreo de comportamientos sospechosos / irregularidades en el tiempo puede ser posible, aunque extremadamente difícil. Por ejemplo, ¿cuáles son los RTT típicos para personas en una determinada red / ubicación y cuál es la variación típica en esto? (por ejemplo, detección de anomalías estadísticas: enlace )

Una combinación de dificultar y detectar anomalías probablemente sea lo mejor que puede hacer para que alguien haga un gran esfuerzo y luego elimine sus puntajes y suspenda la cuenta por un tiempo, de forma similar a fallar en una prueba de dopaje. ..

    
respondido por el Andy Boura 31.07.2014 - 13:28
fuente
0

No usaría el cifrado simétrico, por la razón que dices: uno podría extraer esta clave. Puede almacenar los marcos de tiempo localmente y enviarlos utilizando un cifrado asimétrico;

  1. la solicitud se cifra utilizando la clave pública del servidor; así que uno no puede a un MitM para cambiar sus marcas de tiempo.
  2. su cliente "firma" la solicitud, por lo que está seguro * de que es del cliente.

*: solo puede estar tan seguro hasta que alguien realice una ingeniería inversa de su aplicación y extraiga la clave privada de su aplicación. La mejor manera (si no la única) sería ocultar esta información; cree una clave después de la inicialización de la aplicación, guárdela encriptada / codificada / enmascarada ... y emplee técnicas anti depuración.

Incluso si uno extrae la clave, podría revocar el certificado de ese usuario y no pondrá en peligro el resto.

    
respondido por el ndrix 01.05.2014 - 07:11
fuente

Lea otras preguntas en las etiquetas