Jak mogę zaszyfrować zawartość CoreData na iPhonie

Mam pewne informacje, które chciałbym przechowywać statycznie zaszyfrowane w aplikacji iPhone. Jestem nowy w rozwoju iPhone, niektóre nie jestem zbyt dobrze zaznajomiony z CoreData i jak integruje się z widokami. Mam dane jako JSON, choć mogę łatwo umieścić je w bazie danych SQLITE3 lub w dowolnym innym formacie danych zapasowych. Wezmę to, co najłatwiejsze (a) do szyfrowania i (b) do integracji z warstwą widoku iPhone ' a.

Użytkownik będzie musiał wprowadzić hasło, aby odszyfrować dane za każdym razem aplikacja została uruchomiona. Celem szyfrowania jest uniemożliwienie dostępu do danych w przypadku utraty telefonu przez użytkownika.

Ze względu na szybkość wolałbym zaszyfrować i odszyfrować cały plik naraz, niż szyfrować każde pojedyncze pole w każdym wierszu bazy danych.

Uwaga: to nie jest tym samym pomysłem co pytanie 929744, w którym celem jest powstrzymanie użytkownika przed namieszaniem lub zobaczeniem danych. Dane powinny być doskonale przejrzyste, gdy w użyj.

Uwaga: jestem skłonny używać SQLCipher do przechowywania danych, ale wolałbym używać rzeczy, które już istnieją na frameworku iPhone / CoreData, zamiast przechodzić przez długi proces budowania/integracji.

Author: Community, 2009-10-29

9 answers

Można szyfrować poszczególne właściwości w elementach modelu danych, czyniąc je transformowalnymi właściwościami , a następnie utworzyć podklasę NSValueTransformer, która zaszyfruje i odszyfruje dane dla tej właściwości. Chociaż nie jest to odszyfrowanie całej bazy danych, którego szukasz, będzie ono miało znacznie mniejszy ślad pamięci niż odszyfrowanie całej bazy danych do pamięci. Dodatkowo, pozwoli to na odszyfrowywanie odbywać się leniwie, a nie wszystko z przodu, więc twój aplikacja ładuje się znacznie szybciej. W zależności od zastosowanego szyfrowania, spodziewałbym się nawet, że dostęp do danych na dysku do ładowania każdej jednostki będzie wolniejszy niż proces odszyfrowywania właściwości, więc nie zobaczysz, że dużo kary wydajności podczas uzyskiwania dostępu do właściwości.

Takie transformowalne właściwości są bardzo łatwe w użyciu, ponieważ odczytywanie i zapisywanie do nich odbywa się normalnie, podczas gdy szyfrowanie / deszyfrowanie odbywa się za kulisami.

 70
Author: Brad Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 14:50:45

Czy trzeba szyfrować? Nowsze iPhone ' y (3Gs, 4, iPad...) Szyfruj wszystkie dane na urządzeniu. Dzięki pojedynczemu, zahaszowanemu, solonemu hasłu w aplikacji nikt nie może uzyskać dostępu do danych bez hasła. Dane są piaskownicą ze wszystkich innych aplikacji.

Ochrona danych w systemie iOS

 9
Author: Tom Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:50

Udało mi się zaadaptować przykładowy kod Apple CustomAtomicStoreSubclass do użytku w aplikacji komputerowej Mac, co skutkowało zaszyfrowanym trwałym magazynem w stylu nsbinarystore zapisanym jako pojedynczy plik w systemie plików. Moje podejście:

  • skopiuj CustomAtomicStoreSubclass & CustomAtomicStoreSubclassCacheNode kod źródłowy klasy do mojego projektu i zmienić ich nazwę
  • przechowuj klucz i Wektor początkowy w Pęku Kluczy
  • użyj biblioteki OpenSSL w pakiecie z Mac OS X
  • Encrypt NSKeyedArchiver wyjście i zapis zaszyfrowanego tekstu na dysk (odszyfrowanie jest odwrotne)

Przechwyciłem backing store reads & writes w readFile, metadataForPersistentStoreWithURL:error:, setMetadata:forPersistentStoreWithURL:error:, i save: metody w CustomAtomicStoreSubclass.

Podklasowanie notatek dla Nsatomicstore dla iPhone 'a wygląda podobnie do Mac OS X. być może to podejście może również działać z iPhone' em.

 4
Author: Ty.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 14:54:07

Wiem, że to stare pytanie, ale nadal jest dość istotne i ostatnio musiałem sam zająć się tym tematem.

Transformowalne właściwości są potencjalnym rozwiązaniem, ale nie wydają się działać z NSPredicates, co jest dużą wadą. Nie realizowałem podejścia CustomAtomicStoreSubclass, ale jestem ciekaw, czy inni odnieśli z nim sukces.

Moje obawy były podobne do tych z oryginalnego plakatu, i ostatecznie skończyłem robiąc następujące:

  1. Odszyfruj store to a temp file
  2. załaduj odszyfrowany sklep normalnie
  3. Przenieś sklep do magazynu w pamięci
  4. Usuń niezaszyfrowany sklep

W moim przypadku mój sklep był tylko do odczytu, ale można go rozszerzyć, aby zapisać sklep z powrotem, zaszyfrować go i usunąć niezaszyfrowany sklep jeszcze raz. Możesz również zawsze pominąć #3, Jeśli masz duży sklep i / lub nie martwisz się o to, że niezaszyfrowany plik znajduje się w pobliżu, gdy Twoja aplikacja jest uruchomiona.

The Core Plik danych, z którym pracowałem, miał ~1MB i mógł być bardzo szybko zaszyfrowany / odszyfrowany.

 4
Author: Crutt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-12 01:04:21

Obecnie używam https://github.com/project-imas/encrypted-core-data aby zaszyfrować mój sklep coredata. Jest to niestandardowa implementacja NSIncrementalStore w zasadzie jest zamiennikiem społeczności dla własnego trwałego sklepu apple, który ma opcję szyfrowania. Jest to rozwiązanie drop-in, które działa. Możesz również wyjąć plik sqlite i odszyfrować go za pomocą dowolnego hasła, które wybierzesz w wielu różnych klientach.

Realizacja nie ma 100% pokrycia i nie dopuszcza niektórych funkcji, takich jak predykaty zapytań podrzędnych. Mam zamiar zgłosić swój pierwszy PR do repo, aby mieć nadzieję, że wkrótce to zmieni; -). Prawie mam go w całości pracując z bardzo złożoną aplikacją coredata. Ma również dodatkową zaletę umożliwiającą bezpośredni dostęp do SQLite bez martwienia się o zmianę implementacji apple, ponieważ masz pełny dostęp do źródła.

 4
Author: tslater,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-25 14:22:36

" celem szyfrowania jest uniemożliwienie dostępu do danych w przypadku utraty telefonu przez użytkownika."

System IOS ma ochronę danych od iOS 4, A Core Data obsługuje to przez długi czas. Ochrona danych została zaprojektowana dokładnie do tego rodzaju scenariuszy, które Cię interesują. Domyślnie pliki Core Data NSSQLiteStoreType mają NSFileProtectionCompleteUntilFirstUserAuthentication dla aplikacji zbudowanych z API iOS 5 lub nowszych. Sesja WWDC 2012 Ochrona danych Użytkownika {[9] } porusza ten temat znacznie więcej szczegóły i zaleca użycie NSFileProtectionComplete. Możesz użyć tego z Core Data, przekazując tę wartość w słowniku opcji używanym do otwarcia magazynu Core Data NSSQLiteStoreType.

Przykład:

NSDictionary *storeOptions = @{ NSPersistentStoreFileProtectionKey : NSFileProtectionComplete };
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:storeOptions error:&error]){
Bezpieczeństwo urządzeń iOS zostało omówione w sekcji Bezpieczeństwo urządzeń iOS.]}
 3
Author: quellish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-13 06:57:47

Jak zaszyfrować lub odszyfrować dane?

" interfejs API Certificate, Key I Trust Services zapewnia funkcje do generowania symetrycznych i asymetrycznych kluczy szyfrowania, tworzenia i weryfikacji podpisów cyfrowych oraz szyfrowania kluczy i znaków. Biblioteka CommonCrypto służy do szyfrowania symetrycznego, haszowania i operacji HMAC. Więcej informacji można znaleźć na stronach man Certificate, Key I Trust Services Reference oraz na stronach man CC_crypto(3cc) informacje."

 0
Author: Alex Reynolds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-29 20:59:44

Możesz używać Trasformables, i potwierdzam, nie możesz ich używać z predykatami, ale (i jest gorzej) nie możesz nawet używać

... = [self primitiveValueForKey:@ "crypted_data"];

Jeśli używasz predykatów..

Działa dobrze, jeśli szyfrujesz dane używając:

[self setPrimitiveValue:cryptedPsw forKey:@"crypted_data"];

Do danych kryptograficznych. (i np. na symulatorze.... i przejść na pakiet projektu później..)

 0
Author: ingconti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-11 20:26:31

Szyfrowanie to szyfrowanie bez względu na to, w jakim formacie są Twoje dane, a na pewno nie musisz się martwić o to, jak cokolwiek "integruje się z widokami."Wszystko, co musisz zrobić, to odszyfrować go, zanim spróbujesz przeczytać cokolwiek znaczącego.

 -2
Author: Azeem.Butt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-29 17:13:32