2009-10-13 17 views
16

Apple zaleca używanie NSUserDefaults do przechowywania wszystkich preferencji aplikacji. Wydaje się jednak, że NSUserDefaults można bardzo łatwo edytować. Czy istnieje sposób, aby to zabezpieczyć? Nie szukam sposobu, aby uniemożliwić edycję, tylko utrudniając użytkownikom, aby nie ulegali pokusie zmiany wewnętrznych zmiennych aplikacji.Jak zabezpieczyć NSUserDefaults?

Odpowiedz

-1

dla iPhone? Nie mogą zmienić tych zmiennych, nie ma żadnego Terminal.app, aby to zmienić (z wyjątkiem urządzeń jailbreak, ale jest to problem dla Apple, nie dla ciebie). W przypadku aplikacji komputerowych możesz je zakodować przy użyciu NSData i zostaną one zarchiwizowane jako baza 64.

+0

Zajmuję się urządzeniami z jailbreakiem. – erotsppa

+0

"to jest problem dla Apple, nie dla ciebie" Nie sądzę, że to jest ważne. Jeśli Twoja aplikacja przechowuje coś wartościowego, jest to tylko kwestią czasu, zanim ktoś zrobi robaka/wirusa, który atakuje telefony z jailbreakami i zbiera dane i przesyła je do domu. – AlBeebe

+0

Jeśli chcesz przechowywać coś poufnego, użyj Keychain, a nie NSUserDefaults. –

0

To szczerze mówiąc, wygląda na to, że nie ma w nim miejsca, chyba że chcesz przechowywać coś w numerze NSUserDefaults, które powinno być trzymane w tajemnicy przed użytkownikiem. Użytkownicy tak naprawdę nie podchodzą do swoich preferencji i nie edytują ich bezpośrednio, chyba że jest tam coś ukrytego, czego nie da się zmienić za pomocą interfejsu użytkownika (np. Ukryte preferencje, że Apple nie daje interfejsu użytkownika do zmiany, ale to prawda , stabilne, użyteczne efekty po zmianie).

4

Możesz przechowywać naprawdę bezpieczne dane w pęku kluczy iPhone. Alternatywą dla tego są własne klasy szyfrowania (mogą ograniczać dystrybucję aplikacji) lub zaciemnianie poprzez inne kodowanie, takie jak nsdata, base64 itd.

4

NSUserDefaults powinien zawierać tylko ustawienia, które użytkownik chce zmienić. Dane wewnętrzne aplikacji nie powinny znajdować się w NSUserDefaults. Zapisz swoje wewnętrzne dane w NSDictionary i zapisz je w oddzielnym pliku w dokumentach aplikacji lub folderze tmp.

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

Użyj algorytmu kryptograficznego jak AES szyfrować dane przechowywane w NSUserDefaults. Trzymanie klucza szyfrowania osadzonego w aplikacji, zakodowanego na sztywno lub obliczonego przy użyciu szeregu operacji na wielu elementach, skutecznie odstraszy wszelkie inicjatywy edytowania od przechowywanych wartości. Aby było to łatwiejsze, powinieneś napisać metodę wrapper, która pobiera klucz i wartość clear-text, szyfruje je, a następnie zapisuje je w NSUserDefaults dla ciebie i, oczywiście, robi to samo odwrotnie po odczytaniu wartości z powrotem. Zauważ jednak, że będzie to wolniejsze niż niebezpieczne miejsce, biorąc pod uwagę czas szyfrowania/odszyfrowywania, więc zastanów się nad zastosowaniem tej techniki tylko w najbardziej newralgicznych opcjach konfiguracji swojej aplikacji.

9

Napisałem prostą w użyciu i małą kategorię do tego właśnie celu. Działa na iPhone i Mac OS X, jest bezpłatny i na licencji MIT. Możesz go znaleźć na github: SecureUserDefaults

+2

to zawiesza się na mojej aplikacji – OMGPOP

+0

@OMGPOP wielki fan :) –

22

Jeśli dane nie są wrażliwe (np. Domyślny rozmiar czcionki), przechowuj je w NSUserDefaults.

Jeśli musi być zabezpieczony przed przypadkowym węchem (np. Hasło użytkownika), zapisz go w pęku kluczy.

Jeśli musi być zabezpieczony przed użytkownikiem (na przykład przed kodem rejestracyjnym), należy włączyć własne szyfrowanie, a następnie przechowywać dane w dowolnym miejscu.

+0

Keychain będzie trwać wartości poza odinstalowaniem. Miej to na uwadze podczas używania – xximjasonxx