¿RSA es inútil cuando mi aplicación está completamente descompilada?

8

He programado un juego de Android con Unity Engine. Como usted sabe en Unity, los scripts compilados en un archivo llamado "Assembly-CSharp.dll". Escribí mis scripts en C #.

Después de compilar todo el juego en .apk, lo cambié de nombre a .zip y arrastré el Assembly-CSharp.dll a herramientas como ILSpy, mientras que el programa completo fue completamente descompilado con todos los detalles como mi clave pública RSA o AES contraseña, IV, sal ...
La lógica de mi aplicación es cliente (Android) y servidor (Java).

Cuando el jugador terminó un nivel, con esta URL: enlace , le damos puntuación. Los parámetros reales son nombre de usuario, puntuación, marca de tiempo. Nuestro algoritmo de cifrado es RSA 1024 bit.

Cuando el tramposo / atacante rastrea el tráfico HTTP para usar el ataque de reproducción, verificamos el hash descifrado con RSA y con el parámetro de marca de tiempo lo echamos.

Pero cuando descompiló el código a la perfección con herramientas (ILSpy), simplemente encuentra mi clave pública y descubre que cifro la puntuación de usuario y la marca de tiempo con esa publicación. Luego, escribirá un programa Unity o C # para simplemente cifrar su mensaje manipulado con una nueva marca de tiempo y se confiará en mi aplicación del lado del servidor porque todo es cierto.

Incrementará su puntuación con la publicación de solicitudes HTTP al servidor sin jugar el juego. Él simplemente puede engañar.

¿Qué puedo hacer?

  1. No puedo usar SSL.
  2. Con la ofuscación, solo aumentará el tiempo de crack.
  3. Al proporcionar una clave pública en tiempo de ejecución desde el servidor al cliente, los verificadores de memoria o rastreadores de tráfico pueden simplemente ver la clave pública.
pregunta Jimi 09.08.2015 - 19:26
fuente

2 respuestas

8

La respuesta corta es: Sí, RSA es inútil en este caso. Si toda la lógica del juego ocurre en el lado del cliente, no puedes evitar hacer trampas.

Si tu juego solo informa la puntuación final y nada más, ningún cifrado puede ayudar. El juego debe saber cómo enviar la puntuación y, por lo tanto, la información completa siempre tendrá que estar almacenada en ella. Solo puedes hacer que sea más difícil para el tramposo agregando ofuscación y otros obstáculos.

Sugeriría dos cosas:

  • Envía más que solo la puntuación final. Envía alguna información sobre cómo progresó el juego. (¿Cuál fue el puntaje en un momento determinado, cuando el usuario perdió la vida, qué decisiones tomó ...) Luego verifique en el servidor si es plausible lograr dicho puntaje con tal progreso del juego?
  • Prohibir a cualquier usuario que envíe resultados que no sean válidos o que hayan sido enviados anteriormente. Asegúrate de que tu juego siempre produzca resultados válidos y sea lo suficientemente aleatorio como para no producir el mismo resultado dos veces. Ni siquiera tiene que hacerle saber al tramposo que está prohibido, simplemente oculte su puntuación de cualquier lista pública.
respondido por el michalsrb 09.08.2015 - 21:22
fuente
0

Si su cliente puede enviar la hora, el servidor podría emitir certificados para la clave pública al cliente con un tiempo de caducidad en lugar de codificar la clave pública en su aplicación.

    
respondido por el Janet A. Carr 09.08.2015 - 20:37
fuente

Lea otras preguntas en las etiquetas