J'ai fini de développer une application pour Android et j'ai l'intention de la publier avec GPL. Je veux qu'elle soit open source. Cependant, la nature de l'application (un jeu) est qu'elle pose des énigmes et que les réponses sont codées dans la ressource chaîne. Je ne peux pas publier les réponses! On m'a dit de chercher à stocker les mots de passe en toute sécurité - mais je n'ai rien trouvé de approprié.
Est-il possible de publier mon code source avec un tableau de chaînes caché, crypté ou autrement masqué? Peut-être en lisant les réponses d'une base de données en ligne?
Mise à jour
La solution de Yuval Filmus ci-dessous a fonctionné. Quand je l'ai lu pour la première fois, je ne savais toujours pas comment le faire. J'ai trouvé des solutions, pour la deuxième option: stocker la solution hachée dans le source et calculer le hachage à chaque fois que l'utilisateur le devinait. Pour ce faire, vous devez utiliser la bibliothèque crypto-js à l' adresse http://code.google.com/p/crypto-js/ . Pour Android, utilisez la fonction MessageDigest . Il existe une application (sur fdroid / github) appelée HashPass qui fait cela.
Réponses:
Vous avez au moins deux options, en fonction du problème que vous souhaitez résoudre.
Si vous souhaitez que des lecteurs innocents de votre code n'obtiennent pas les réponses par inadvertance, ou au moins que vous vouliez rendre les choses plus difficiles pour que les utilisateurs ne soient pas tentés, vous pouvez chiffrer les solutions et stocker la clé dans le code, par exemple. résultat de quelques calculs (pour le rendre encore plus difficile).
Si vous souhaitez empêcher les utilisateurs de récupérer la réponse, vous pouvez utiliser une fonction unidirectionnelle ou, dans le jargon de l'ordinateur, une fonction de hachage . Stocker un hachage de la réponse, et ils vous pouvez tester si la réponse est correcte sans qu'il soit possible d' en déduire la réponse du tout sans la trouver d' abord. Cela a pour inconvénient qu'il est plus difficile de rechercher une réponse proche de la bonne réponse, bien qu'il existe des solutions même à ce problème.
la source
Vous avez
deuxtrois options:Gardez les réponses séparées du reste du code source
Si vous voulez que votre code soit open source, mais que les réponses ne soient pas open source, vous devez ouvrir le code source de l'application sans les questions et réponses, les questions et réponses étant un "plugin" fermé distinct ou fichier de données. Votre application Android regrouperait ces deux éléments en une seule application.
Mettez les réponses dans votre code source
Sinon, si vous considérez les questions et les réponses comme une partie essentielle de ce que vous voulez utiliser en source ouverte, vous devriez alors placer les réponses dans le code source, de préférence non obscurci pour que les autres puissent les lire et les modifier . Obstruer le code source afin qu'il ne puisse pas être compris et modifié ne correspond pas vraiment aux principes du code source ouvert.
Mettez les réponses sur un serveur sur Internet
Avec les deux solutions ci-dessus, il est possible pour quelqu'un qui a téléchargé votre application de trouver les réponses sans lire votre programme dans les deux cas - peu importe la façon dont vous obscurcissez / chiffrez vos réponses, si votre programme peut identifier la réponse sans informations supplémentaires, Un humain peut-il examiner votre application compilée?
Si vous voulez vraiment vous assurer que personne ne peut trouver les réponses, alors la seule véritable option est de ne pas leur donner les réponses et de laisser l'application appeler un service Web, etc. ... chaque fois qu'ils veulent connaître la réponse. L’application doit envoyer la réponse saisie par l’utilisateur et le service Web doit indiquer à l’application si la réponse est correcte ou non. De cette manière, l’utilisateur n’a aucun moyen de dire quelle est la réponse tant qu’ils ne disposent pas de la bonne réponse (bref). forcer brusquement le service Web, que vous pouvez détecter et protéger contre).
Si vous cherchez des moyens de brouiller vos réponses, cela me suggère que vous ne voulez pas vraiment ouvrir vos réponses en source, alors vous devriez envisager les premières options.
S'il est essentiel que l'utilisateur ne puisse pas trouver la réponse à l'avance, alors la troisième option est votre seul choix réel. Cependant, j'ai du mal à imaginer un scénario dans lequel cela en vaudrait la peine, surtout parce que cela empêche vos utilisateurs d'utiliser votre application sans connexion Internet.
la source
Si l'objet doit masquer des chaînes provenant d'une lecture occasionnelle du code source mais les garder ouvertes afin que d'autres personnes puissent facilement apporter leurs propres modifications - par exemple, si vous publiez le code source dans une aventure textuelle et que vous ne voulez pas qu'un texte descriptif apparaisse qui constituerait un spoiler, alors utilisez quelque chose de réversible comme rot13.
En fait, vous pouvez effectuer une rotation 13 dans tous vos fichiers de traduction et les retourner à la volée.
C'est garder l'esprit ouvert. La "magie" aléatoire n'est pas vraiment conviviale pour les programmeurs.
la source
Open source nécessite que le code source soit rendu public et disponible, pas les données du jeu. Vous pouvez donc facilement placer les données dans un autre fichier et ne pas le publier. Ajoutez un peu de cryptage si vous souhaitez empêcher la lecture accidentelle du fichier. Je doute qu'un crypto fort soit nécessaire pour votre application.
la source
Pourquoi voudriez-vous stocker vos réponses dans votre code source GPL si vous ne voulez pas que vos utilisateurs les connaissent? Même s'ils ne sont pas connus ou faciles à craquer maintenant, ils peuvent l'être (et le seront probablement) à l'avenir.
Au lieu de les stocker dans votre application, utilisez une base de données externe. Créez un petit service Web qui compare les réponses à ce qui se trouve dans votre base de données. Laissez ensuite votre application appeler ce service Web chaque fois que celle-ci doit être vérifiée. Le principal problème est que, du fait qu’il nécessite un accès à Internet, vous perdrez un peu de vitesse et votre potentiel d’utilisateur. votre licence d'application ne devrait s'appliquer que pour l'application elle-même, pas pour le service Web.
Vous pouvez aussi simplement mettre vos réponses dans une petite base de données et la mettre dans votre programme. Autant que je sache, la GPL ne s'applique qu'au code source, pas aux données stockées par votre application. Je peux me tromper à ce sujet, cependant.
la source
N'oubliez pas que même si vous stockez une base de données sur un serveur Web distant, vous pouvez toujours dupliquer la base de données en notant simplement toutes les paires clé / valeur correctes observées. Et de manière générale, les applications mobiles doivent essayer de ne pas générer d'erreurs ni de cesser de fonctionner parce que le réseau est en panne (utilisez la messagerie en file d'attente et mettez à jour lorsque vous le pouvez).
Donc, si vous voulez une base de données locale, mais que vous n'aimez pas l'idée de le déchiffrer de manière flagrante, vous pouvez utiliser un filtre bloom (pour éviter de parler à un réseau ou d'avoir une grosse base de données déchiffrée localement). C’est ainsi que les vérificateurs d’orthographe fonctionnaient lorsque l’espace mémoire était vraiment restreint.
Donc, si vous ajoutez des paires question / réponse dans le filtre comme:
Si vous demandez si "Capitol of Virginia? Richmond" est dans le jeu, il répondra soit "définitivement non", soit "presque certainement oui". Si vous obtenez trop de faux positifs, agrandissez la base de données.
Vous pouvez disposer d’une immense base de données dans un espace restreint, en supposant que l’utilisateur épellera la question et la réponse exactement comme vous le souhaitez. La taille réduite de la base de données facilite les mises à jour, car elles doivent probablement être transférées via des réseaux sans fil.
la source