Question

Toute base de données SQLite sur l'iPhone est tout simplement un fichier fourni avec l'application. Il est relativement simple pour quiconque d'extraire ce fichier et l'interroger.

Quelles sont vos suggestions pour chiffrer soit le fichier ou les données stockées dans la base de données.

Modifier L'application est un jeu qui sera joué contre d'autres utilisateurs. Information sur les utilisateurs forces et les faiblesses seront stockées dans la base de données. Je ne veux pas un utilisateur de pouvoir jail-break le téléphone leur réputation etc / puissance puis gagner le tournoi / ligue etc (NB: Essayer d'être vague que l'idée est sous NDA).

Je ne ai pas besoin de cryptage militaire, je ne veux pas seulement pour stocker des choses dans le texte brut.

Edit 2: Un peu plus de précisions, mes principaux objectifs sont

  1. Faites pirater non-trivial des données sensibles
  2. Avoir un moyen simple de découvrir si les données ont été modifiées (une sorte de contrôle)
Était-ce utile?

La solution

Vous ne pouvez pas faire confiance au client, période. Si votre application autonome peut le déchiffrer, donc ils seront. Soit mettre les données sur un serveur ou ne vous embêtez pas, comme le nombre de personnes qui craquent réellement pour améliorer les statistiques sera minuscule, et ils devraient probablement être récompensés pour l'effort de toute façon!

Mettre une chaîne dans la base de données en disant « s'il vous plaît ne pas tricher ».

Autres conseils

Il y a au moins deux approches plus faciles ici (à la fois gratuit) qui permettent d'éviter le cryptage des valeurs ou des bases de données en mémoire:

# 1 - ipa détection des fissures

Évitez les tracas techniques (et légal) de chiffrer la base de données et / ou le contenu et simplement déterminer si l'application est piraté et désactiver le réseau / notation / classement aspects du jeu. Voir ci-après pour plus de détails:

http://thwart-ipa-cracks.blogspot.com/ 2008/11 / detection.html

# 2 - vérification des données d'intégrité

Vous pouvez stocker un HMAC / hachage Salted des colonnes importantes dans chaque ligne lors de l'enregistrement de vos données (et dans votre sqlite initial db). Lors du chargement de chaque ligne, de vérifier les données par rapport à la HMAC / hachage et, si la vérification échoue agir en conséquence.

Aucune approche ne vous obligera à remplir les formulaires d'exportation de cryptage requis par le gouvernement Apple / États-Unis.

soumission de score

Ne pas oublier que vous aurez besoin de faire quelque chose de similaire pour les soumissions de pointage réelles pour protéger contre les valeurs qui viennent d'autre chose que votre application. Vous pouvez voir une mise en œuvre de ce dans le cadre cocos2d-iphone et cocoslive http: // code. google.com/p/cocos2d-iphone/ et http://code.google.com / p / cocoslive /

Réponse aux commentaires

Il n'y a pas de solution ici qui 100% d'éviter l'altération des données. Si tel est une exigence, le client doit être vue seulement et tous les états et la logique doivent être calculées sur un serveur de confiance. Selon l'application, les mécanismes anti-triche supplémentaires seront nécessaires sur le client.

Il y a un certain nombre de livres sur le développement des jeux massivement multijoueurs qui traitent de ces questions.

Avoir un hachage avec un secret connu dans le code est probablement une approche raisonnable (au moins, lorsque l'on considère le type d'applications qui existent généralement sur l'App Store).

Comme Kendall a dit, y compris la clé de l'appareil demande essentiellement de se fissurée. Cependant, il y a des gens qui ont leurs raisons pour les données obscurcissant avec une clé sur l'appareil. Si vous êtes déterminé à le faire, vous pouvez envisager d'utiliser pour votre mise en œuvre SQLCipher . Il est une version de SQLite qui fournit un cryptage transparent, niveau de la page de l'ensemble DB. Il y a un tutoriel sur le mobile Orchard pour l'utiliser dans l'iPhone applications.

Quelle est la probabilité que vous pensez qu'il est que votre utilisateur normal faire cela? Je suppose que vous allez dans le magasin d'application, ce qui signifie que tout est signé / crypté avant d'obtenir sur l'appareil de l'utilisateur. Ils devraient jailbreak leur appareil pour accéder à votre base de données.

Quel type de données Entreposez-vous de telle sorte qu'il a besoin de chiffrement? Si elle contient des mots de passe entré par l'utilisateur, vous n'avez pas vraiment besoin de les chiffrer; l'utilisateur n'a pas besoin de connaître leur propre mot de passe. Si ses données BLOB générique que vous souhaitez que l'utilisateur d'accéder par l'application, il pourrait être aussi simple que le stockage d'un blob crypté en utilisant la balise API de sécurité .

Si c'est la base de données entière vous voulez sécurisée, alors vous voulez continuer à utiliser l'API de sécurité, mais sur l'ensemble du dossier à la place, et décrypter le fichier si nécessaire avant de l'ouvrir. La question est que si l'application se ferme sans nettoyage, vous vous retrouvez avec un fichier décrypté.

Vous pouvez jeter un oeil à des bases de données résidant en mémoire, ou les bases de données temporaires que vous pouvez créer soit en utilisant un modèle db ou un schéma codé en dur dans le programme (jetez un oeil à la documentation sqlite3_open ). Les données peuvent être décryptées, inséré dans la base de données temporaire, puis supprimez la base de données déchiffrées. Faites-le dans le sens inverse lors de la fermeture de la connexion.

Modifier :

Vous pouvez réaliser votre propre système de cryptage Je suis sûr avec juste un système de sécurité très simple par XOR-ment les données avec une valeur stockée dans l'application, et de stocker un hachage un autre endroit pour vous assurer qu'il ne change pas , ou quelque chose.

SQLCipher:

Sur la base de mon expérience SQLCipher est la meilleure option pour chiffrer la base de données.

Une fois la clé ( « clé PRAGMA ») est définie SQLCipher chiffrera automatiquement toutes les données dans la base de données! Notez que si vous ne définissez pas une clé alors SQLCipher fonctionnera de façon identique à une base de données standard SQLite.

L'appel à sqlite3_key ou « clé PRAGMA » devrait se produire la première opération après l'ouverture de la base de données. Dans la plupart des cas SQLCipher utilise PBKDF2, une clé fonction de dérivation salée et itéré, pour obtenir la clé de cryptage. Alternativement, une application peut dire SQLCipher d'utiliser une clé binaire spécifique dans la notation de blob (notez que SQLCipher nécessite exactement 256 bits de matériel de clé), i.e..

entrer image description ici

Référence:

http://sqlcipher.net/ios-tutorial

J'espère que quelqu'un gagner du temps sur l'exploration de cette

Ignorer les problèmes philosophiques et d'exportation, je suggère que vous seriez mieux chiffrer les données dans le tableau directement.

Vous devez obscurcir la clé de déchiffrement (s) dans votre code. En règle générale, cela signifie que les casser en morceaux et coder les chaînes en hexadécimal et en utilisant des fonctions pour assembler les morceaux de la clé ensemble.

Pour l'algorithme, j'utiliser une implémentation de confiance AES quelle qu'en soit la langue que vous utilisez. Peut-être celui-ci pour C #:

http://msdn.microsoft.com/en-us/magazine /cc164055.aspx

Enfin, vous devez être conscient des limites de l'approche. A savoir, la clé de déchiffrement est un maillon faible, il sera disponible en mémoire lors de l'exécution en texte clair. (Au minimum) Il doit être pour que vous puissiez l'utiliser. La mise en œuvre de votre système de cryptage est une autre faiblesse - des défauts il y a des failles dans votre code aussi. Comme plusieurs autres personnes ont signalé vos communications client-serveur sont suspects aussi.

Vous devez vous rappeler que votre exécutable peut être examiné dans un éditeur hexadécimal où les chaînes vont sauter hors texte clair de la jonque au hasard qui est votre code compilé. Et que de nombreuses langues (comme C # par exemple) peuvent être décompilé et tout ce qui sera absent sont les commentaires.

Cela dit, chiffrer vos données soulèvera la barre pour tricher un peu. Combien dépend de la façon dont vous êtes attentif; mais même si un adversaire déterminé sera toujours casser votre cryptage et de tricher. De plus, ils vont probablement écrire un outil pour le rendre facile si votre jeu est populaire; vous laissant avec un scénario course aux armements à ce moment-là.


En ce qui concerne une valeur de somme de contrôle, vous pouvez calculer une somme de contrôle basée sur la somme des valeurs d'une ligne en supposant que vous avez des valeurs numériques dans votre base de données suffisamment pour le faire. Ou, pour un groupe de valeurs booléennes, vous pouvez les stocker dans un champ varbinary et utiliser l'opérateur exclusif pour les ^ bitwise comparer -. Vous devriez finir avec 0s

Par exemple,

pour les colonnes numériques,

2 | 3 | 5 | 7 | avec une colonne de contrôle | 17 |

pour booléens,

0 | 1 | 0 | 1 | avec une colonne de contrôle | 0101 |

Si vous faites cela, vous pouvez même ajouter une ligne de synthèse à la fin qui résume vos checksum. Bien que cela peut être problématique si vous ajoutez constamment de nouveaux records. Vous pouvez également convertir des chaînes à leurs composants ANSI / UNICODE et additionner ces trop.

Ensuite, lorsque vous voulez vérifier la simple somme de contrôle de faire une sélection comme ceci:

Select * 
FROM OrigTable 
right outer join 
(select pk, (col1 + col2 + col3) as OnTheFlyChecksum, PreComputedChecksum from OrigTable) OT on OrigTable.pk = OT.pk
where OT.OnTheFlyChecksum = OT.PreComputedChecksum

Il semble être plus simple de synchroniser tous les résultats du tournoi à tous les iPhones dans le tournoi. Vous pouvez le faire à chaque match: avant un match, si les bases de données de deux téléphones se contredisent, l'avertissement est affiché.

Si l'utilisateur A falsifie le résultat si son jeu avec l'utilisateur B, ce résultat se propage jusqu'à ce que B ne voit finalement avec l'avertissement que les données de A ne correspondent pas à son téléphone. Il peut alors aller battre expliquer à A que son comportement ne va pas, juste la façon dont il est dans la vie réelle si quelqu'un triche.

Lorsque vous calculez les résultats du tournoi finale, montrer l'avertissement, les noms de nom, et jeter tous les jeux avec des résultats contradictoires. Cela enlève l'incitation à tricher.

Comme dit précédemment, le cryptage ne résoudra pas le problème puisque vous ne pouvez pas faire confiance au client. Même si votre personne moyenne ne peut pas utiliser désassembleur, tout ce qu'il faut est une personne motivée et quel que soit le cryptage que vous avez sera brisé.

Cependant, si sur la plate-forme Windows, vous pouvez également sélectionner SQLiteEncrypt pour satisfaire votre needs.SQLiteEncrypt étend le soutien de cryptage SQLite, mais vous pouvez le traiter comme bibliothèque sqlite3 c originale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top