2009-10-13 13 views
16

Apple consiglia di utilizzare NSUserDefaults per memorizzare tutte le preferenze dell'app. Tuttavia, sembra che NSUserDefaults sia facilmente modificabile. C'è un modo per garantire questo. Non sto cercando un modo per rendere impossibile la modifica, rendendola più difficile in modo che gli utenti non siano così tentati di modificare le variabili interne dell'applicazione.Come proteggere NSUserDefaults?

risposta

-1

per iPhone? Non possono alterare queste variabili, non c'è Terminal.app per cambiarlo (eccetto i dispositivi jailbroken, ma questo è un problema per Apple, non per te). Per le app desktop, è possibile codificarle utilizzando NSData e verranno archiviate come base 64.

+0

Sono interessato ai dispositivi jailbroken. – erotsppa

+0

"questo è un problema per Apple, non per te" Non penso che sia valido. Se la tua app memorizza qualcosa di prezioso, è solo una questione di tempo prima che qualcuno faccia un worm/virus che si rivolge a telefoni jailbroken e recupera quei dati e li spedisce a casa. – AlBeebe

+0

Se è necessario memorizzare qualcosa di sensibile, utilizzare il portachiavi, non NSUserDefaults. –

0

Per essere onesti, questo sembra un non-merito a meno che non si desideri archiviare qualcosa in NSUserDefaults che dovrebbe essere tenuto nascosto all'utente. Gli utenti non entrano realmente nelle loro preferenze e li modificano direttamente, a meno che non ci sia qualcosa di nascosto in ciò che non può essere modificato attraverso l'interfaccia utente (come le preferenze nascoste che Apple non ti fornisce un'interfaccia per cambiare, ma che hanno reali , stabile, effetti utili se modificati).

4

È possibile memorizzare dati davvero sicuri nel portachiavi di iPhone. Le alternative a questo sono le tue classi di crittografia (può limitare la distribuzione delle applicazioni) o l'offuscamento attraverso altre codifiche come nsdata, base64, ecc.

4

NSUserDefaults deve contenere solo le impostazioni che vuoi che l'utente possa modificare. I dati interni dell'app non dovrebbero essere in NSUserDefaults. Salvare i dati interni in un NSDictionary e scriverli in un file separato nei documenti dell'app o nella cartella tmp.

NSDictionary* dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys]; 
BOOL succeeded = [dict writeToFile:[self dbFullPathName] atomically:YES]; 
2

usare un algoritmo crittografico come AES per crittografare i dati memorizzati in NSUserDefaults. Mantenere la chiave di crittografia incorporata nell'app, codificata o calcolata utilizzando una successione di operazioni su più elementi, può dissuadere qualsiasi iniziativa di modifica sui valori memorizzati. Per semplificare le cose, dovresti scrivere un metodo wrapper che prenda una chiave e un valore in chiaro, li cripta e poi li memorizzi in NSUserDefaults per te, e, ovviamente, fa la stessa cosa al contrario quando legge i valori indietro. Presta attenzione, tuttavia, che sarà più lento rispetto all'archiviazione non sicura, tenendo conto del tempo di crittografia/decodifica, quindi considera di applicare la tecnica solo alle opzioni di configurazione più sensibili della tua app.

9

Ho scritto una categoria semplice da usare e piccola per esattamente quello scopo. Funziona su iPhone e Mac OS X, è gratuito e con licenza MIT. Puoi trovarlo su github: SecureUserDefaults

+2

si blocca sulla mia app – OMGPOP

+0

@OMGPOP big fan :) –

22

Se una parte di dati non è sensibile (ad esempio, la dimensione predefinita del carattere), memorizzarla in NSUserDefaults.

Se è necessario proteggersi da snooping casuale (ad es., Password dell'utente), memorizzarlo nel portachiavi.

Se è necessario essere protetto dall'utente (ad es. Codice di registrazione), sarà necessario eseguire il rolling della propria crittografia, quindi archiviare i dati ovunque si desideri.

+0

Keychain persisterà i valori oltre la disinstallazione. Bare che in mente quando lo si utilizza – xximjasonxx