Ich habe die Entwicklung einer App für Android abgeschlossen und beabsichtige, sie mit der GPL zu veröffentlichen - ich möchte, dass sie Open Source ist. Die Art der Anwendung (eines Spiels) besteht jedoch darin, dass sie Rätsel stellt und die Antworten in die Zeichenfolgenressource codiert. Ich kann die Antworten nicht veröffentlichen! Mir wurde gesagt, ich solle versuchen, Passwörter sicher zu speichern - aber ich habe nichts Passendes gefunden.
Ist es möglich, meinen Quellcode mit einem versteckten, verschlüsselten oder auf andere Weise verdeckten String-Array zu veröffentlichen? Vielleicht durch das Lesen der Antworten aus einer Online-Datenbank?
Aktualisieren
Die Lösung von Yuval Filmus unten hat funktioniert. Als ich es zum ersten Mal las, war ich mir immer noch nicht sicher, wie ich es machen sollte. Ich habe einige Lösungen für die zweite Option gefunden: Speichern der Hash-Lösung in der Quelle und Berechnen des Hashs, wenn der Benutzer dies errät. Um dies in Javascript zu tun, gibt es die crypto-js Bibliothek unter http://code.google.com/p/crypto-js/ . Verwenden Sie für Android die MessageDigest- Funktion. Es gibt eine Anwendung (auf fdroid / github) namens HashPass, die dies tut.
Antworten:
Sie haben mindestens zwei Möglichkeiten, je nachdem, welches Problem Sie lösen möchten.
Wenn Sie möchten, dass unschuldige Leser Ihres Codes nicht versehentlich die Antworten erhalten, oder wenn Sie es den Benutzern zumindest etwas schwer machen möchten, damit sie nicht in Versuchung geraten, können Sie die Lösungen verschlüsseln und den Schlüssel als Teil Ihres Codes speichern, z Ergebnis einiger Berechnungen (um es noch schwieriger zu machen).
Wenn Sie verhindern möchten, dass Benutzer die Antwort abrufen, können Sie eine Einwegfunktion oder im Fachjargon eine Hash-Funktion verwenden . Speichern Sie einen Hash der Antwort, und Sie können testen, ob die Antwort korrekt ist, ohne dass Sie die Antwort ableiten können, ohne sie zuerst zu finden. Dies hat den Nachteil, dass es schwieriger ist, nach einer Antwort zu suchen , die der richtigen nahe kommt , obwohl es auch für dieses Problem einige Lösungen gibt.
quelle
Sie haben
zweidrei Möglichkeiten:Halten Sie die Antworten vom restlichen Quellcode getrennt
Wenn Sie möchten, dass Ihr Code Open Source ist, die Antworten jedoch nicht Open Source, dann öffnen Sie den Code für die Anwendung ohne die Fragen und Antworten, wobei die Fragen und Antworten ein separates Closed-Source-Plugin sind. oder Datendatei. Ihre Android-App würde beide in einer einzigen App bündeln.
Tragen Sie die Antworten in Ihren Quellcode ein
Wenn Sie alternativ die Fragen und Antworten als einen Kernbestandteil dessen betrachten, was Sie als Open-Source-Lösung wünschen, sollten Sie die Antworten im Quellcode ablegen, vorzugsweise ohne Verschleierung, damit andere sie lesen und ändern können . Die Verschleierung von Quellcode, so dass er nicht verstanden und modifiziert werden kann, entspricht nicht wirklich den Prinzipien von Open Source Code.
Stellen Sie die Antworten auf einen Server im Internet
Mit beiden oben genannten Lösungen kann in beiden Fällen jemand, der Ihre App heruntergeladen hat, die Antworten herausfinden, ohne Ihr Programm abzuspielen. Dabei spielt es keine Rolle, wie Sie Ihre Antworten verschleiern / verschlüsseln, wenn Ihr Programm die Antwort ohne zusätzliche Informationen identifizieren kann kann ein Mensch Ihre kompilierte App untersuchen.
Wenn Sie wirklich sicherstellen möchten, dass niemand die Antworten herausfinden kann, besteht die einzige echte Option darin, ihnen keine Antworten zu geben und die App einen Webservice anrufen zu lassen, usw., wann immer sie die Antwort wissen möchten. Die App sollte die Antwort senden, die der Benutzer eingegeben hat, und der Webservice sollte der App mitteilen, ob die Antwort korrekt ist oder nicht. Auf diese Weise kann der Benutzer erst dann sagen, wie die Antwort lautet, wenn er bereits die richtige Antwort hat (kurz von Brute-Forcing des Web-Service, den Sie erkennen und schützen können).
Wenn Sie nach Wegen suchen, um Ihre Antworten zu verschleiern, deutet das darauf hin, dass Sie Ihre Antworten nicht unbedingt als Open Source-Lösung anbieten möchten, und Sie sollten daher die ersten Optionen in Betracht ziehen.
Wenn es kritisch ist, dass der Benutzer die Antwort nicht im Voraus findet, ist die dritte Option Ihre einzige echte Wahl. Ich kann mir jedoch nur schwer vorstellen, in welchem Szenario dies den Aufwand wert wäre, nicht zuletzt, weil es Ihre Benutzer daran hindert von der Verwendung Ihrer App ohne Internetverbindung.
quelle
Wenn das Ziel darin besteht, Zeichenfolgen vor dem zufälligen Lesen des Quellcodes zu verbergen, diese jedoch offen zu halten, damit andere Personen problemlos ihre eigenen Änderungen vornehmen können - zum Beispiel, wenn Sie die Quelle in einem Textabenteuer veröffentlichen und keinen beschreibenden Text anzeigen möchten was einen Spoiler ausmachen würde, dann benutze etwas reversibles wie rot13.
Tatsächlich könnten Sie alle Ihre Übersetzungsdateien rot13 und sie sofort wieder umdrehen.
Das hält den offenen Geist. Zufällige "magische" Hashes sind nicht wirklich programmiererfreundlich.
quelle
Open Source erfordert, dass der Quellcode veröffentlicht und verfügbar ist, nicht die Spieldaten. So können Sie die Daten einfach in eine andere Datei einfügen und diese nicht veröffentlichen. Fügen Sie etwas Krypto hinzu, wenn Sie das gelegentliche Lesen der Datei verhindern möchten. Ich bezweifle, dass eine starke Krypto für Ihre Anwendung erforderlich ist.
quelle
Warum sollten Sie Ihre Antworten in Ihrem GPL-Quellcode speichern, wenn Sie nicht möchten, dass Ihre Benutzer sie kennen? Auch wenn sie derzeit nicht bekannt sind oder leicht zu knacken sind, können (und werden) sie es in Zukunft sein.
Verwenden Sie eine externe Datenbank, anstatt sie in Ihrer App zu speichern. Erstellen Sie einen kleinen Webdienst, der die Antworten mit denen in Ihrer Datenbank vergleicht. Lassen Sie dann Ihre Anwendung diesen Webservice aufrufen, wann immer dies überprüft werden muss. Das Hauptproblem ist, dass Sie aufgrund der Notwendigkeit eines Internetzugangs an Geschwindigkeit und potenzieller Benutzerbasis verlieren. Ihre App-Lizenz sollte nur für die App selbst gelten, nicht für den Webservice.
Sie können Ihre Antworten auch einfach in eine kleine Datenbank eingeben und in Ihr Programm einfügen. Soweit mir bekannt ist, bezieht sich die GPL nur auf den Quellcode, nicht auf Daten, die Ihre App speichert. Darin könnte ich mich jedoch irren.
quelle
Denken Sie daran, dass die Datenbank auch dann dupliziert werden kann, wenn Sie sie auf einem Remote-Webserver speichern, indem Sie einfach alle korrekten Schlüssel / Wert-Paare aufschreiben, die angezeigt wurden. Im Allgemeinen sollten mobile Apps versuchen, keine Fehler zu verursachen oder nicht mehr zu funktionieren, da das Netzwerk ausgefallen ist (verwenden Sie Messaging in der Warteschlange und "Aktualisieren, wenn Sie können").
Wenn Sie also eine lokale Datenbank möchten, die jedoch nicht unbedingt entschlüsselt werden soll, können Sie einen Bloom-Filter verwenden (um zu vermeiden, dass Sie mit einem Netzwerk kommunizieren oder lokal über eine große entschlüsselte Datenbank verfügen). So funktionierte die Rechtschreibprüfung, wenn der Speicherplatz sehr knapp war.
Wenn Sie also Frage / Antwort-Paare wie folgt in den Filter einfügen:
Wenn Sie fragen, ob "Capitol of Virginia? Richmond" im Set ist, wird entweder "definitiv nein" oder "mit ziemlicher Sicherheit ja" geantwortet. Wenn Sie zu viele Fehlalarme erhalten, vergrößern Sie die Datenbank.
Sie könnten eine riesige Datenbank auf kleinstem Raum haben, vorausgesetzt, der Benutzer schreibt die Frage und Antwort genau so, wie Sie es erwarten. Die Datenbank klein zu halten hilft bei Updates, da diese wahrscheinlich über drahtlose Netzwerke übertragen werden müssen.
quelle