2011-07-01 9 views
8

¿Necesito almacenar el puntaje con un hash, es decir, para protegerlo de ser editado/engañado por un usuario? Desde mi nuevo conocimiento, el usuario no puede ver y manipular estos datos almacenados localmente, como archivos plist, por ejemplo. ¿Alguien puede elaborar?Guardando la puntuación del juego localmente en el dispositivo con iOS ... ¿se necesita seguridad?

[Editar] Estoy almacenando puntajes localmente y cargándolos periódicamente a las tablas de clasificación de Game Center. Incluso si el dispositivo tiene jailbreak, me gustaría tener seguridad para evitar que el usuario manipule los puntajes. ¿Cuál es un buen enfoque?

+0

¿Por qué no almacena su puntaje en NSUserDefualt? – Tirth

+0

@RRB Mi aplicación admite varios usuarios. – andrewz

Respuesta

6

De hecho, me gustaría hacer esto:

guardarlo en un NSDictionary y convertirlo en un objeto NSData. Ahora viene la parte divertida:

Cifrar en AES usando esta clase:
https://web.archive.org/web/20160806074714/http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html

Este es un estándar de cifrado militar que devolverá un NSData objeto cifrado. Luego solo guárdalo en un archivo y lee/escribe cuando sea necesario. He tenido muy buenas experiencias con esta clase y el usuario no puede hacer nada al respecto.

Mucho mejor que simplemente almacenarlo a plena vista con NSUserDefaults.

¡Pruébalo!

-1

he desarrollado muchos juegos de iOS, y acabo de guardar los resultados locales mediante:

  • Utilización de la clase NSUserDefaults o
  • escribir directamente a un archivo de configuración local (por ejemplo,. txt, .plist, etc.).

Técnicamente, otras aplicaciones no pueden tocar los archivos dentro del paquete de la aplicación, por lo que no tiene que preocuparse de que se editen.

+0

esto simplemente no es verdad! Esos lugares pueden ser manipulados! – fredpi

3

En teoría, el usuario no puede manipular estos datos almacenados.

Sin embargo, hay métodos para acceder a todo el sistema de archivos, para que las personas puedan abrir la carpeta de su juego, editar el plist y modificar sus puntajes.

Personalmente, si estuviera haciendo un juego sin tablas de clasificación en línea, no me preocuparía. Permita que tengan la puntuación que desean, siempre y cuando los otros jugadores no se vean afectados por ella.

+0

Los puntajes se almacenan localmente, pero se cargarán en Game Center periódicamente. ¿Tiene sugerencias sobre cómo codificar el puntaje al almacenarlo en un archivo para los casos de jailbreak? – andrewz

+3

No es necesario que el dispositivo tenga jailbreak para hacerlo, solo use una aplicación como iExplorer (http://www.macroplant.com/iexplorer) que le permita acceder al sistema de archivos. –

1

Puede codificar los puntajes con su propio valor de sal y decodificar cuando sea necesario. Esto evitará que el usuario simplemente cambie el número que ve.

3

También soy nuevo en la programación de iPhone: acabo de crear mi primer juego pequeño y actualmente agrego Game Center a la próxima versión (llamada Smiley Lines;) Creo que muchos estarían en la misma situación que yo, solo quiero un poco hash simple para que las personas con jailbreak no modifiquen fácilmente el puntaje en los valores predeterminados del usuario, evitando así arruinar la tabla de clasificación en línea.

Si es así, creo que la conversión de NSData a la solución AES es bastante complicada (para un novato iOS y para una simple necesidad de hash un entero) y un poco excesivo. Después de buscar, se encuentra una gran solución aquí: Matthias Plapper has subclassed the NSUserDefaults class to provide some simple hashing with a secret key.Súper fácil de usar - copiar pegar los dos archivos de fuentes y aquí hay un uso de ejemplo:

// Configuring user defaults. It is recommended that you do this 
// immediately after the app did launch. 
    [NSUserDefaults setSecret:@"shh, this is secret!"]; 

// Write secure user defaults 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setSecureBool:YES forKey:@"IsRegistered"]; 

    // Read secure user defaults 
    BOOL valid = NO; 
    BOOL registered = [defaults secureBoolForKey:@"IsRegistered" valid:&valid]; 
    if (!valid) { 
     // the property has been modified, handle this situation 
    } else { 
     // Valid property, do whatever you need to do 
    } 

Gracias a ton Matthias!

Cuestiones relacionadas