Core Data et sécurité

samirsamir Membre

Hello,


 


Je dois chiffrer "crypter" les données locales de mon application. J'ai comme contrainte d'associer le mot de passe de l'application ( l'application aura un mot de passe au lancement ) à  la clé de chiffrement.


 


J'ai plusieurs solutions :


 


Utiliser Core Data ( La solution idéale):


 


 1. Utiliser l'API de cryptage des fichier Apple iOS : Dans ce cas le système génère luis même la clé de chiffrement en se basant sur le "passcode" utilisateur et la classe de protection utilisé.  


 


Problème : J'ai aucun moyen d'associer le mot de passe de l'application à  la génération de cette clés.


 


2. Utiliser Commen Crypto : Je ne sais ce qu'on peut faire avec cette solution, Est-ce possible de crypter facilement le store Core Data ? et aux niveaux performances ? Si vous avez des retours d'expériences c'est super.


 


Utiliser SQLite :


 


Y a des librairies externes qui chiffrent facilement une base de données sqlite comme SQLCipher.


 


Problème : ça me soule d'utiliser SQLite dans un projet dont j'ai beaucoup de synchronisation à  faire entre  mes données locales et les données serveurs,.....


 


 


Donc voila je suis embêté parce j'ai l'impression que je vais opté pour SQLite et ça va être la catastrophe. 


 


Voyez-vous une solution se basant sur Core Data ? Merci


 


 


 


Réponses

  • samirsamir Membre

    L'article parle du premier cas que j'ai cité ( peut être que j'ai mal expliqué :). Mais le problème avec cette solution c'est que j'ai pas la main sur la clés du chiffrement, la clés est associée avec le mot de passe utilisateur et autre chose que le système gère lui même.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Nick Harris parle d'une vidéo de WWDC 2010 sur "Securing Application Data", qui se trouve ici https://developer.apple.com/videos/wwdc/2010/. Peut-être, ça t'aiderait ?


  • FKDEVFKDEV Membre

    Je ne l'ai jamais utilisé, mais il y a ça:


    https://github.com/project-imas/encrypted-core-data


  • yoannyoann Membre

    CoreData ne dipose d'aucun mécanisme de chiffrement natif.


     


    Le seul moyen de chiffrer avec CoreData c'est d'utiliser des IncrementalStore personnalisé, ce qui est complexe à  mettre en oe“uvre (j'en ai déjà  écris, c'est pas donné à  tout le monde, et si on y ajoute de la crypto, il y a toute les chances de se planter). Cette solution c'est ce que tente de mettre en oe“uvre le lien de FKDEV. Jamais testé et un gros audit est nécessaire IMHO avant de l'envisager.


     


    Le chiffrement natif de l'iPhone est de mon point de vue la solution la plus intéressante pour la plupart des applications.


     


    C'est pas gratifiant pour le dev mais au moins ça fonctionnera pour de vrai.


  • samirsamir Membre

    Ok Merci pour vos réponses.


     


    c'est bien parti pour SQLite ...malheureusement :)


  • Joanna CarterJoanna Carter Membre, Modérateur

    Pourquoi abandonner Core Data pour SQLite quand Core Data utilise une base de données SQLite ?


  • AliGatorAliGator Membre, Modérateur
    Mais surtout, c'est quoi cette lubie de vouloir absolument que le mot de passe de l'application soit utilisé dans le seed, alors que le mot de passe du téléphone l'est déjà  ? Pour moi la contrainte elle-même n'est pas justifiée, si tu arrives à  l'expliquer à  ton client et à  la faire sauter en expliquant que le mdp du tel est déjà  utilisé, et qu'utiliser la solution native d'Apple sera + sécurisée et permettra une meilleure performance que de réinventer la roue de ce côté... tu pourras partir tout de suite sur la solution 1, ce qui coûtera moins cher à  tout le monde et aura beaucoup moins de risque de créer des failles de sécurité que si tu l'implémentes toi-même...
  • Question naà¯ve : pourquoi vouloir que le mdp de l'appli (ou du tel --> les 4 chiffres pour débloque le tel?) soit "inclus" dans la clé de chiffrement ?


    Autre question : si je génère des données prelodées et que je joins dans le bundle de mon app un fichier core data, sera-t-il chiffré ? Si oui, je ne vois pas comment la clé pourrait dépendre du tel.
  • FKDEVFKDEV Membre
    mars 2015 modifié #11


    Pourquoi abandonner Core Data pour SQLite quand Core Data utilise une base de données SQLite ?




     


    Parce que Core Data n'est à  priori pas linké avec une version de sqlite permettant le chiffrage de la base.


     


    Si on pouvait contrôler la version de sqlite utilisée par Core Data, alors ce serait jouable.


    On utiliserait les extensions sqlite qui permettent de chiffrer la base, et voilà .


  • Joanna CarterJoanna Carter Membre, Modérateur
    On peut modifier les authorisations pour le Core Data store :

    In iOS 5 and later Core Data by default uses NSFileProtection to protect persisted data.


    For apps built for iOS 5.0 or later, persistent stores now store data by default in an encrypted format on disk. The default protection level prevents access to the data until after the user unlocks the device for the first time. You can change the protection level by assigning a custom value to the NSPersistentStoreFileProtectionKey key when configuring your persistent stores. For additional information about the data protection that are new in iOS 5.0, see “Data Protection Improvements.”

    If you want to modify the default file protection behavior for your Core Data store, change the value for the key NSPersistentStoreFileProtectionKey to a different NSFileProtectionKey value in your store options dictionary.


    Example:


    NSDictionary *storeOptions = @{NSPersistentStoreFileProtectionKey : NSFileProtectionComplete};


    if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:storeOptions error:&error]){

    [self presentError:error];

    }



  • Pourquoi abandonner Core Data pour SQLite quand Core Data utilise une base de données SQLite ?




     


    Par ce que CoreData utilise un backend SQLite classique et ne permet pas, sauf à  écrire un NSIncrementalStore, de configurer la base SQLite comme on le souhaite.


     




    Mais surtout, c'est quoi cette lubie de vouloir absolument que le mot de passe de l'application soit utilisé dans le seed, alors que le mot de passe du téléphone l'est déjà  ? Pour moi la contrainte elle-même n'est pas justifiée, si tu arrives à  l'expliquer à  ton client et à  la faire sauter en expliquant que le mdp du tel est déjà  utilisé, et qu'utiliser la solution native d'Apple sera + sécurisée et permettra une meilleure performance que de réinventer la roue de ce côté... tu pourras partir tout de suite sur la solution 1, ce qui coûtera moins cher à  tout le monde et aura beaucoup moins de risque de créer des failles de sécurité que si tu l'implémentes toi-même...




     


    Selon l'application, ça a du sens.


     


    Par exemple, si je fait une application de gestion de mot de passe, j'en ai rien a braire que le téléphone soit sécurisé, je veux que mes données le soient. Car les données applicatives stocké de manière sécurisé sur iOS ne le sont tant qu'elles restent sur iOS.


     


    Je ne veux pas que la compromission de la sauvegarde du téléphone permette d'accéder à  mes mots de passe.


     


    Et à  l'avenir ça me permet de porter cela sur OS X qui lui ne dispose pas de chiffrement natif du même ordre (FileVault déchiffre tout d'un coup, il n'y a pas de sous-clefs par utilisateurs par exemple).


     




    On peut modifier les authorisations pour le Core Data store :

     




     


    Rien à  voir avec la semoule, c'est simplement changer le niveau de protection des fichiers de CoreData vis à  vis du système natif au système de fichiers d'iOS.


     


    Cela ne permet pas de chiffrer le contenu de la base en elle même.

  • Je tiens au passage à  rappeler que chiffrer une base de donnée est quelque chose d'assez complexe. Ce n'est pas donné à  tout le monde et globalement, ça n'a de sens que pour protéger les données à  froid.


     


    Une fois l'application lancée, les données sont accessible en mémoire. Ou a minima les indexes permettant de faire des requêtes dessus sans devenir dingue. Sinon cela veut dire que pour chaque requête on est obliger de déchiffrer toutes les entrées de la base. C'est impossible.


     


    La plupart du temps, lorsque l'on chiffre une base de données, on chiffre essentiellement son espace de stockage sur disque et une personne autorisé entre une clef de déchiffrement au démarrage du serveur de base de données. Ce que propose en gros l'iPhone.


     


    Les rares cas où on chiffre plus que cela, c'est lorsque des secrets fort sont stockés en base.


     


    La possibilité est alors de stocker ce secret sous forme de donnée brute chiffrée. Il n'y a alors qu'une seule colonne de chiffrée et le reste est en clair (pour permettre de trouver la ressource, donc les clefs primaires et éventuellement le titre de la ressource pour faire une recherche dessus).


     


    ça c'est très simple à  faire avec CoreData et CommonCrypto. Le principe de base est :


     


    NSDictionnary de départ -> NSData (conversion en PLIST) -> CommonCrypto pour chiffrer ça avec AES CBC -> NSData (chiffré)


     


    Et tu stock ce NSData final.


     


    Autre chose, c'est pas forcément une bonne chose que de chiffrer les données avec le mot de passe de l'utilisateur. Car le jour où il en change c'est l'enfer pour tout modifier.


     


    Généralement le mot de passe de l'utilisateur protège une clef aléatoire qui elle chiffre les données. Quand tu change ton mot de passe, tu ne fait que protéger la même clef avec un autre code. Sans tout refaire. C'est le fonctionnement de FileVault et de la protection iOS en gros.


  • Autre question naà¯ve : si mon fichier core data est chiffré est que l'iPhone est jailbreaké, la personne peut-elle facilement lire le fichier (en clair) ?


  • AliGatorAliGator Membre, Modérateur

    Autre question naà¯ve : si mon fichier core data est chiffré est que l'iPhone est jailbreaké, la personne peut-elle facilement lire le fichier (en clair) ?

    J'aurais envie de dire qu'on s'en fout.

    Un utilisateur qui jailbreak son iPhone doit avoir conscience que par définition, jailbreaker signifie "faire sauter toutes les sécurités que iOS met en place pour ta propre protection". Du coup c'est à  eux d'en prendre pleinement la responsabilité.

    Alors certes souvent les gens font ça pour lever aussi des limitations qui les gênent, mais ces limitations sont là  justement, du moins pour une bonne partie, pour la sécurité. On ne peut pas à  la fois enlever la porte de la maison parce qu'on trouve ça chiant d'avoir à  l'ouvrir à  chaque fois qu'on veut sortir... et espérer quand même être protégé contre un cambriolage.

    Donc si les gens jailbreak leur iPhone, il faut qu'ils aient conscience que par définition ça casse les protections, et donc que plus rien n'empêche une application malveillante d'aller fouiller dans les données des autres applications, aller y chercher des mots de passe qui seraient stockés, aller récupérer des données qui étaient prévu pour rester dans la sandbox de l'application d'origine. Ils ne peuvent pas alors espérer que leurs données qu'ils mettent dans leur iPhone soit toujours aussi bien protégées alors qu'ils ont fait sauter les verrous, c'est à  eux d'assumer qu'il y a un risque pour leurs mots de passe.

    Perso nous on met toujours une clause dans les CGU disant que si le device est jailbreaké c'est de la responsabilité de l'utilisateur d'assumer qu'il a fait sauter les protections et qu'on ne peut du coup plus garantir la sécurité de ses données.
  • Le jailbreak c'est le Mal !  >:D


  • colas_colas_ Membre
    mars 2015 modifié #18
    En fait, je vais joindre dans mon bundle un fichier core data et j'aimerais que les données qui y résident ne soient accessibles que via l'appli donc que ces données soient difficiles extractibles. C'est mes données que je veux protéger !


    D'où ma question : si le device est jailbreaké et que les données sont protégées avec le procédé d'Apple, est-ce que le fichier sera lisible ?
  • Joanna CarterJoanna Carter Membre, Modérateur
    Sans jailbreaker ton iPhone tu peux essayer à  lire le fichier en utilisant iExplorer : http://www.macroplant.com/iexplorer/
  • AliGatorAliGator Membre, Modérateur
    Ce que tu cherches à  faire (protéger des données livrées avec l'app) est conceptuellement impossible : à  chaque fois que tu vas vouloir boucher un trou à  un endroit, ça va en ouvrir un à  un autre endroit.
    • Par exemple si tu embarques ta base (non chiffrée) dans ton bundle IPA avec l'appli, avant même de parler de jailbreak c'est très facile de la récupérer. Si tu synchronises ton iPhone avec ton Mac via iTunes ça va copier tes IPA sur ton mac pour les sauvegarder (ou même si tu les télécharges directement depuis iTunes depuis ton Mac, dans tous les cas tu peux facilement récupérer l'IPA sur ton Mac in fine). Et du coup il suffit de dézipper l'IPA pour aller trouver le fichier sqlite dedans
    • Du coup tu te dis "je vais le chiffrer". Oui mais pour la chiffrer, il va bien falloir que tu aies une clé de déchiffrement pour que quand l'appli se lance tu puisses déchiffrer ta base. Donc cette clé il faut l'embarquer dans ton IPA. Donc ça ne fait que déplacer le problème
    • Alors tu pourrais te dire "je vais pas embarquer cette clé, je vais la télécharger au premier lancement". Oui mais comment s'assurer que la connexion à  ton serveur à  ce premier lancement est sécurisée (pour s'assurer qu'un petit malin ne va pas venir espionner le traffic de son propre réseau Wifi au lancement de ton app pour voir ce qui passe dessus et voir la clé qui t'es retournée) ? Ou alors il faut une connexion sécurisée avec vérification de l'identité des 2 parties (SSL Two-Way). Mais ça nécessite alors d'embarquer dans l'IPA la clé privée permettant à  ton app de t'authentifier sur le serveur... donc encore une fois, ça ne fait que déplacer le problème
    • Tu pourrais éventuellement embarquer ta clé de chiffrement de ta base directement dans ton code, quitte à  l'éclater et la parsemer dans plusieurs constantes pour perdre un peu celui qui chercherait à  analyser/désassembler ton application pour la récupérer. Mais ça va pas aller bien loin car ça va être vite fait de trouver à  quel endroit tu assembles ces constantes et donc reconstituer la clé
    • Ou même plus simple encore si l'utilisateur a un iPhone jailbreaké il va pouvoir attacher un débuggeur à  ton application pendant qu'elle tourne et dumper sa mémoire et accéder directement au contenu de la base de données que l'application aura bien dû déchiffrer pour pouvoir la manipuler de toute façon au runtime (comme le mentionnait déjà  yoann en fait)
    Au final il n'y a pas vraiment de solution miracle... quelle que soit la solution dans tous les cas par définition si ton application peut déchiffrer ta base de données pour pouvoir y lire dedans (et va bien falloir qu'elle le fasse !), alors tes données ne sont jamais complètement protégées vu que sur un environnement jailbreaké y'aura moyen de lire les données une fois déchiffrées par l'app.

    Reste à  voir si tu veux jouer au jeu du chat et de la souris avec les pirates, pour à  défaut de rendre ça impossible, de leur complexifier au maximum la tâche... mais à  ce jeu là , on sait bien qui perd à  chaque fois... ça veut dire qu'il faudrait que tu aies autant ou + de connaissances en sécurité qu'un éventuel pirate pour réussir à  le berner et à  être plus malin que lui... je doute que beaucoup de monde ici ait un niveau de compétence assez élevé en sécurité pour faire cela (et même dans ce cas ça ne protège en rien)
  • Réponse hyper intéressante Ali avec plein de détails techniques ! Merci :p


     


    Je pense que dans mon cas, chiffrer les données à  l'aide du clé est la bonne solution (ou alors rien du tout).


     


    D'après ce que vous avez dit, il me reste une difficulté, c'est que ma base core data est produite par une appli OSX...


     


    Merci @samir d'avoir ouvert cette discussion très intéressante !


    Ce qui est bien avec ce forum, c'est que c'est une sorte de blog vivant  o:)


  • FKDEVFKDEV Membre
    mars 2015 modifié #22

    En fait, le seul moyen de sécuriser la base de donnée, c'est de ne pas l'embarquer mais de télécharger des morceaux quand l'utilisateur en a besoin.


Connectez-vous ou Inscrivez-vous pour répondre.