Comment stocker des informations critiques telles que secret, clé, token, encryptionKey dans l'application iOS
lorsque nous parlons de sécuriser l'application iOS, nous oublions souvent de sécuriser les informations les plus sensibles telles que secret, clé, jeton, clé cryptée. Cette information est stockée dans le binaire iOS. Donc aucun de vos protocoles de sécurité côté serveur ne vous aidera.
il y a beaucoup de suggestions que nous ne devrions pas stocker de telles informations dans l'application mais les stocker dans le serveur et les obtenir via un appel de service Web sécurisé SSL. Mais ce n'est pas possible pour toutes les applications. E. g. si mon application n'a pas besoin de service web du tout.
dans l'application iOS nous avons l'option suivante pour stocker des informations.
- UserDefault: ne convient Pas pour ce cas
- Chaîne constante: ne convient pas dans ce cas. Peut être inversée ingénieur pour récupérer ou tout simplement utiliser chaînes de la commande
- Base De Données Sécurisée: stocker dans une base de données sécurisée et cryptée. Mais encore une fois ont responsabilité de protéger le nom d'utilisateur et le mot de passe de la base de données.
- Porte-clés: il est préférable de stocker les informations critiques. Mais nous ne pouvons pas sauvegarder les informations avant d'installer l'application. Pour stocker dans le porte-clés, nous devons d'abord ouvrir l'application, lire à partir d'une certaine source et stocker dans le porte-clés. Pas approprié pour notre cas.
- Constante De Hachage Personnalisée: ne pas utiliser directement secret, token, clé du fournisseur de services (mixpanel, paypal), utilisez plutôt du hash version de cette information de custom key. Ce n'est pas non plus la solution parfaite. Mais ajoute de la complexité pendant le piratage.
veuillez envoyer une solution à ce problème.
6 réponses
si vous ne voulez pas utiliser votre propre backend alors utilisez Apple. Vous pouvez configurer les ressources à la demande et garder le fichier de données avec votre clé, jeton, n'importe quel secret sur le serveur D'Apple. Après le premier téléchargement, Vous pouvez écrire ces données au porte-clés qui est suffisamment sécurisé. Je suppose que le réseautage entre iOS et Apple server est aussi assez sécurisé.
1) Connexion Internet Requise
1.1) Les Notifications Push Une excellente façon d'avoir un échange de données sécurisé pourrait être d'utiliser les services push (silencieux) D'Apple, ceux qui utilisent les apns et envoyer des données via https - plus de détails 3.1
1.2) Une approche plus ou moins similaire est également utilisée lors de la distribution de nouveaux certificats d'utilisateur à des applications déjà déployées, si une réinstallation de l'application n'est pas une opportunité et l'application nécessite de toute façon une connexion Internet fonctionnelle.
inconvénient: connexion réseau de travail nécessaire et essentiellement l'information arrive à l'application, quand elle est déjà exécutée = > ne semble pas être approprié pour votre cas. (voir l'étape 4)
2) données statiques (car il n'y aura pas d'échange sans connexion réseau / partenaire de communication)
cryptage des données avec clé privée fournie dans le paquet lui-même. Que ce soit maintenant une chaîne ou un hachage, qui peut être modifié à l'inverse avec des fonctions que vous avez emebedded dans votre application. Depuis iOS9, il est assez difficile de décompiler les applications iOS et fondamentalement, vous aurez principalement un coup d'oeil dans les header-files fournis. Donc si vous aviez une telle fonction, chaîne, valeur de hachage ou autre, assurez-vous que vous l'avez dans votre .m-file!
mais encore une fois: si l'information n'est pas spécifique à l'appareil ou à l'utilisateur, juste un secret à travers votre propre micro-environnement, valide à travers tous les appareils, vous devez fournir les données cryptées et la méthode de déchiffrement dans le même paquet, s'il n'y a pas de processus de mise à jour / échange d'information ou autre chose, vous pouvez penser à.
bon pour le cryptage: système iOS.Sécurité 23-->https://developer.apple.com/reference/security ou simplement openssl
La différence entre votre décrite trousseau approche est: Vous avez une valeur, qui sera cryptée et stockée en toute sécurité. (2) décrit le approche pour avoir une valeur semi-sécurisée cryptée et stockée (en paquet), qui sera décryptée
3) Echange d'informations
vous décrivez des données critiques, qui ont été hachées par une autre instance. Grand! - Assurez-vous, relly assurez-vous, l'instance à laquelle vous parlez est vraiment l'instance que vous attendez d'être (Network Hooking prevention avec certificat ssl pinning etc, mais même ici, vous pourriez avoir intrus (men-in-the-middle)). Et vous (probablement) ont un certificat étant fourni dans votre paquet d'application, pour assurer l'authenticité du serveur de communication - ici, vous allez de nouveau, des données qui est censé assurer un processus sécurisé entre certaines instances de votre micro environnement. Néanmoins, ces données sont fournies dans le forfait de votre demande.
3.1 échange D'Information Sécurisé extension-Silent Push Utilisez les serveurs D'Apple pour échanger vos secrets à cette fin. Si vous avez juste besoin d'échanger petit les blocs de données. Je recommande d'utiliser des notifications de poussée silencieuses à l'utilisateur, celles-ci fonctionnent même sans l'autorisation explicite de l'utilisateur. Avantage énorme: si vos secrets ou vos clés changent, vous pouvez informer les utilisateurs dès que possible sur le changement. Ils n'auront probablement besoin du changement que lorsqu'ils recevront de nouvelles données, qui devraient fonctionner de façon fiable dans la plupart des cas. Exception: l'échange de Données dans les réseaux locaux ou via bluetooth, dans ce cas, je vous recommande de fournir une notification à l'utilisateur d'avoir l'exigence de mettre à jour une clé de déchiffrement locale. Ou échangez la clé dans ce format aussi. Encore une fois: je divulgue des informations détaillées sur votre architecture d'environnement. Inconvénient: Vous ne savez pas, si un utilisateur utilisé votre application pour la première fois, jusqu'à ce que l'utilisateur "dit" vous si. https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1
3.1 échange D'Information Sécurisé étendu-achat de L'application Utilisez un achat frree In-App pour l'utilisateur pour obtenir les données à votre téléphone. Bon point ici: vous pouvez fournir de plus grands morceaux de données facilement, comme cela devrait être une demande active par l'utilisateur, l'utilisateur s'attend à ce que certains temps de traitement et doit également être conscient du fait d'exiger une connexion Internet en état de marche. L'inconvénient: L'utilisateur devrait le sélectionner volontairement. D'ici là, l'application ne fonctionnerait pas en conséquence. https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction.html#//apple_ref/doc/uid/TP40008267
ainsi, il diffère légèrement de l'approche (2) dans son idée de base.
En bref: Pouvez-vous fournir informations supplémentaires, de quel type de données vous avez besoin pour chiffrer/voulez stocker en toute sécurité et si vous aurez un échange réseau ou non?
besoin d'un peu plus d'informations ici :-)
je tiens à souligner une fois de plus qu'une application sur iOS n'est plus aussi facile à déchiffrer, même la décompilation n'obtiendrait pas tout, vous vous attendez à ce qu'elle obtienne. Par exemple, les outils de décryptage comme dumpdecrypt ne fonctionnaient correctement que jusqu'à iOS 8.4
je suis d'accord avec @Lobsterman et de croire que le meilleur moyen est d'utiliser une combinaison de ces éléments.
- ne pas inclure l'information secrète dans l'application au départ.
- Deliver la clé secrète soit en tant que contenu d'achat In-App, ressource à la demande ou l'envoyer par notification push. Cela ajoutera l'avantage de changer la clé périodiquement si vous voulez et le changement prendra effet sans aucun effort supplémentaire.
- ajouter l'entrée au porte-clés accès une fois le contenu livré.
Cocoapods-keys
pourrait être une meilleure option.
cocoapods-keys
doc
les noms des clés sont stockés dans ~/.cocoapods/touches/ et des valeurs de l'OS X trousseau. Lorsque vous exécutez pod install ou pod update, une classe Objective-C est créé avec des versions de touches, ce qui rend difficile il suffit de vider le contenu du binaire déchiffré et extraire les clés. À l'exécution, les clés sont dévissées pour être utilisées dans votre application.
Le générés Les classes de l'objectif-C sont stockées dans les gousses / Cocoapodeskeys répertoire, donc si vous vérifiez dans votre dossier Pods, il suffit d'ajouter Pods / CocoaPodsKeys à vos .dossier gitignore. CocoaPods-supports de clés intégration dans les projets Swift ou Objective-C.
consultez ce lien pour l'installation, l'utilisation et plus d'infos : https://github.com/orta/cocoapods-keys
Il me semble que la meilleure façon de le faire est d'utiliser le construit en CloudKit. Vous pouvez sauver vos secrets dans le CloudKit Tableau De Bord et puis les récupérer au démarrage. Puisque CloudKit n'est qu'une couche de transport, vous devrez stocker les secrets de l'application dans le porte-clés.
je sais que vous avez mentionné le porte-clés n'étant pas idéal pour votre cas d'utilisation (pas sûr pourquoi), mais c'est une bonne façon de ne pas inclure les secrets dans votre application. Vous ne pouvez pas aller chercher votre app secrets d'une autre source.
CloudKit l'accès est sécurisé en utilisant le compte Système iCloud et s'il n'y a pas de compte iCloud, vous accédez toujours aux serveurs iCloud en toute sécurité. Un autre avantage supplémentaire de ceci est que vous pouvez changer vos secrets d'application à tout moment, donc si vous voulez être encore plus sûr, vous pouvez mettre en œuvre un horaire de rotation.
si les données sont extrêmement sensibles, elles ne doivent jamais être stockées hors ligne sur l'appareil parce que tous les appareils sont fissurables. Si vous voulez encore stocker sur l'appareil, alors Porte-clés est une option pour stocker des données en toute sécurité, mais son cryptage est basé sur le code pin de l'appareil. Les utilisateurs ne sont pas obligés de définir un NIP, donc dans certains cas, les données peuvent même ne pas être cryptées. En outre, le code pin de l'utilisateur peut être facilement piraté.
Une meilleure solution est d'utiliser quelque chose comme SQLCipher qui est une base de données SQLite entièrement cryptée. La clé de cryptage peut être appliquée par l'application et séparée du code pin de l'utilisateur.