¿Cómo puedo hacer que sea más difícil para los jugadores hackear datos de nivel de juego?

Nota: esto es en relación con Android específicamente, pero la mejor respuesta podría no ser específica de la plataforma, por lo tanto, las otras etiquetas.

Considere un juego similar a las aves enojado: usted tiene un montón de niveles. Cada vez que termine un nivel, el siguiente nivel está disponible para jugar, pero no antes. ¿Cómo puedo hacer que sea más difícil para los jugadores hackear mis archivos de juego y desbloquear niveles que no deberían estar disponibles? Suponga que los datos de progresión se almacenan localmente.

Mis pensamientos:

En android, todos los archivos de la aplicación se almacenan en una carpeta a la que el usuario sólo puede acceder si tienen acceso root (por defecto, nunca lo hacen, pero normalmente es muy fácil de obtener, siempre y cuando usted google un poco). Ahora mismo, estoy usando una base de datos sqlite que se parece a algo así:

LevelId = pk | UnlockStatus = int, 0 = locked, 1 = unlocked, 2 = completed with 1 star, ... 

Esto está bien siempre y cuando el usuario no tenga root o no esté familiarizado con dónde se almacenan los archivos de la aplicación. Si tienen raíz sin embargo, este archivo es muy fácil de editar.

Por lo que puedo decir, aves enojado almacena sus datos de nivel en un archivo .lua , al menos según su nombre. No puedo encontrar ningún archivo de texto o db archivo que contiene información de nivel. Abrir este .lua en un editor de texto no muestra nada más que charabia. No he probado un editor hexadecimal.

Usar una tabla sql es muy conveniente. ¿Hay una manera fácil de almacenar los datos de progresión en la tabla sql de tal manera que el usuario tendrá un tiempo más difícil hacer sentido de ella? Idealmente, tampoco debería ser demasiado lenta para implementar. Siendo un juego fuera de línea, no me importa que mucho si el jugador hackes o no, por lo que estoy buscando la mejor calidad – tiempo de implementación de compensación. Las respuestas teóricas que producen mucho más tiempo de implementación para considerablemente más calidad también son apreciadas sin embargo.

Lo mejor sería ahorrar datos usando algún tipo de cifrado. En android, SQLite no ofrece encriptación a nivel de base de datos. Sin embargo, puede cifrar los valores (registros) en la tabla y descifrarlos después de consultar.

Otra forma podría ser guardar sus datos como par clave / valor en algún tipo de archivo de texto (ejemplo de .lua en angrybirds) en la memoria interna o externa y realizar la encriptación en el contenido del archivo. Por otro lado, descifrarlo en tiempo de ejecución y leer sus pares clave / valor.

Tadaaa! problema resuelto

Hacking sus datos (binarios de juego / nivel de datos / highscore-mesas, etc) que se almacena localmente en el dispositivo (o, eventualmente, remotamente) siempre estará accesible (y decodable) por alguien que realmente quiere y sabe cómo hacerlo.

Cada capa de seguridad que añades solo hará que sea más difícil (y esto toma más tiempo) para el hacker. A veces incluso agregar una capa adicional de seguridad toma más tiempo para implementar en su lado que para que el hacker lo entienda. (Hay ejemplos famosos en la historia de la computación, uno es el XBox IIRC).

La seguridad por oscuridad es lo que intenta hacer al cifrar los datos en su caso. Esto no es suficiente a largo plazo. Especialmente cuando se proyecta se reúne gran público.

un método sencillo: almacenar datos de niveles diferentes para cada jugador.

código inferior a 5 líneas:

 //encrypt code: save_level = "level_txt" + "#"+ md5("gamename" + "playername" + level_txt) //decrypt code: level_plaintxt, md5_level = save_level.split("#") if (md5_level == md5("gamename" + "playername" + level_plaintxt)) return level_plaintxt 
  • Error en sqlite "DROP TABLE IF EXISTS" android
  • ¿Debo abrir () y cerrar () mi base de datos SQL constantemente o dejarla abierta?
  • Empaquetado DB de SQLite con mi aplicación
  • Shell de salida Android de sqlite
  • SQLite en Android Cómo actualizar una fila específica
  • Error de sintaxis con KEY EXTRANJERA en CREATE TABLE
  • Android / SQLite - Operación de bits en la cláusula WHERE
  • SQL eliminar de una tabla + un jointable?
  • Comprobar si existe una entrada en una base de datos
  • La mejor manera de acceder a la base de datos en el servidor mediante la aplicación Android
  • SelectionArgs en SQLiteQueryBuilder no funciona con valores enteros en columnas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.