¿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.
- Android sqlite insert no está insertando
- Android cursor cómo obtener valores nulos de columnas
- android sqlite crea índice con la cláusula where falla
- Android SQL Lite no crece
- Android - SQLiteException: near "=": error de sintaxis (código 1)
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.
- Unparseable date Exception Servicios móviles de Windows Azure
- Cómo obtener los nombres de todas las tablas presentes en una base de datos en Android lite de SQL
- Cómo leer una columna específica de SQLiteBatabase existente en Android?
- SQLite: forma eficiente de eliminar lotes de filas
- Tabla de puntuaciones altas
- Atascado con diseño de SQL android utilizando SQLite y Group By
- Android SQLite - Nueva tabla VS. Nueva base de datos
- Ejemplo de cuenta de SQLite
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
- Cómo almacenar y recuperar (clave, valor) tipo de datos utilizando las preferencias guardadas android
- ¿Cómo re tamaño de la Altura de los artículos en Spinner con opción múltiple?