48 votes

Comment chiffrer le contenu CoreData sur un iPhone

J'ai quelques informations que j'aimerais stocker de manière statique chiffré sur une application iPhone. Je suis nouveau sur le développement sur iPhone, certains que je ne suis pas très familier avec CoreData et comment il s'intègre avec les points de vue. J'ai les données en JSON, mais je peux facilement le mettre dans une base de données SQLITE3 ou tout autre support de format de données. Je vais prendre tout ce qui est plus facile (un) pour chiffrer et (b) pour l'intégration avec l'iPhone couche de la vue.

L'utilisateur devra entrer le mot de passe pour déchiffrer les données à chaque fois que l'application est lancée. Le but de chiffrement est de conserver les données soient accessibles si l'utilisateur perd le téléphone.

Pour des raisons de vitesse, je préfère de chiffrer et de déchiffrer le fichier entier en une seule fois plutôt que de chiffrement de chaque champ de chaque ligne de la base de données.

Remarque: ce n'est pas la même idée que la Question 929744, dans laquelle le but est de garder à l'utilisateur de jouer avec ou de voir les données. Les données doivent être parfaitement transparent lors de l'utilisation.

À noter également: je suis prêt à utiliser SQLCipher pour stocker les données, mais préfère utiliser des choses qui existent déjà sur l'iPhone/CoreData cadre plutôt que de passer par la longue construction/intégration des processus impliqués.

75voto

Brad Larson Points 122629

Vous pouvez crypter des propriétés individuelles dans votre Base de Données modèle entités en les rendant transformables propriétés, puis en créant une NSValueTransformer sous-classe qui permet de chiffrer et déchiffrer les données de cette propriété. Si ce n'est pas l'ensemble de la base de données de décryptage que vous cherchez, il aura beaucoup moins de mémoire que de déchiffrer l'intégralité d'une base de données en mémoire. En outre, elle va permettre le décryptage à faire langoureusement, plutôt que tout à l'avance, de sorte que votre application se chargent beaucoup plus rapidement. Selon le cryptage utilisé, je dirais même de s'attendre à ce que les données du disque des accès pour le chargement de chaque entité serait plus lent que le processus de déchiffrement pour les propriétés, de sorte que vous ne voyez pas que beaucoup de performances lors de l'accès à la propriété.

Transformable propriétés de ce type sont très faciles à utiliser, car vous lire et à écrire comme à la normale, tandis que le chiffrement / déchiffrement se passe derrière les coulisses.

8voto

Tom Andersen Points 3523

Avez-vous besoin de chiffrer? Les nouveaux iPhones (3G, 4, iPad ...) cryptent toutes les données de l'appareil. Avec un seul mot de passe haché et salé sur votre application, personne ne peut accéder aux données sans mot de passe. Les données sont en mode bac à sable à partir de toutes les autres applications.

Protection des données sur iOS

5voto

tslater Points 647

Je suis actuellement en utilisant https://github.com/project-imas/encrypted-core-data pour chiffrer mon coredata magasin. C'est une coutume de la mise en œuvre de NSIncrementalStore est fondamentalement une communauté de remplacement pour apple magasin persistant qui a une option de cryptage. C'est une goutte dans une solution qui fonctionne. Vous pouvez également prendre le fichier sqlite et déchiffrer le code secret que vous choisissez en de nombreux clients différents.

La mise en œuvre n'a pas de couverture de 100% et ne permet pas de certaines fonctionnalités telles que la sous-requête des prédicats. Je vais soumettre mon premier RP pour les pensions de titres à espérer que le changement que bientôt ;-). J'ai presque il completley de travail avec un très complexes coredata app. Il a aussi l'avantage de vous permettre directe SQLite accès sans avoir à se soucier de pomme de mise en œuvre du changement sur vous, puisque vous avez un accès complet à la source.

4voto

Crutt Points 261

Je sais que c'est une vieille question, mais c'est toujours très pertinentes et j'ai récemment eu à aborder le sujet de moi-même.

Transformable propriétés sont une solution possible, mais n'a pas l'air de fonctionner avec NSPredicates, ce qui est un gros inconvénient. Je n'ai pas poursuivre la CustomAtomicStoreSubclass approche, mais je suis curieux de savoir si d'autres ont eu du succès avec elle.

Mes préoccupations étaient similaires à ceux de l'original de l'affiche, et j'en fin de compte à la liquidation de la manière suivante:

  1. Décrypter le magasin à un fichier temp
  2. Charge de la décrypté magasin normalement
  3. Migrer les stocker dans une banque de mémoire
  4. Supprimer clair le magasin

Dans mon cas, mon magasin est en lecture seule, mais ce pourrait être élargi afin d'écrire le magasin en retour, les chiffrer, et de supprimer en clair le magasin une fois de plus. Vous pouvez également toujours ignorer #3 si vous avez un grand magasin et/ou ne sont pas concernés en ce qui concerne les fichiers non chiffrés assis autour pendant que votre application est en cours d'exécution.

La Base de Données de fichier je travaillais avec a ~1MO, et pourrait être crypté/déchiffré très rapidement.

4voto

Ty. Points 41

J'ai réussi à adapter Apple CustomAtomicStoreSubclass exemple de code pour une utilisation dans un ordinateur de bureau Mac application, ce qui entraîne une chiffré NSBinaryStore de style magasin persistant écrit en un seul fichier dans le système de fichiers. Mon approche:

  • Copie de l' CustomAtomicStoreSubclass & CustomAtomicStoreSubclassCacheNode code source de la classe dans mon projet et de les renommer
  • Stockage de la clé et l'initiale du vecteur dans le Trousseau d'accès
  • Utiliser la bibliothèque OpenSSL, fourni avec Mac OS X
  • Chiffrer NSKeyedArchiver sortie et d'écrire le texte chiffré à disque (le déchiffrement est l'inverse)

J'ai intercepté magasin de sauvegarde lecture et l'écrit dans l' readFile, metadataForPersistentStoreWithURL:error:, setMetadata:forPersistentStoreWithURL:error:, et save: méthodes CustomAtomicStoreSubclass.

Le sous-classement des Notes pour l'iPhone NSAtomicStore de Référence de Classe ressemble à celle de Mac OS X est. Peut-être cette approche peut également travailler avec l'iPhone.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X