Skończyłem opracowywać aplikację na Androida i zamierzam opublikować ją na GPL - chcę, żeby była open source. Jednak natura aplikacji (gry) polega na tym, że zadaje ona zagadki i ma zakodowane odpowiedzi w zasobie łańcucha. Nie mogę opublikować odpowiedzi! Powiedziano mi, żebym szukał bezpiecznego przechowywania haseł - ale nie znalazłem nic odpowiedniego.
Czy jest możliwe opublikowanie mojego kodu źródłowego z ukrytą, zaszyfrowaną lub w inny sposób zasłoniętą tablicą łańcuchów? Może czytając odpowiedzi z internetowej bazy danych?
Aktualizacja
Rozwiązanie Yuval Filmusa poniżej zadziałało. Kiedy po raz pierwszy to przeczytałem, nadal nie byłem pewien, jak to zrobić. Znalazłem kilka rozwiązań dla drugiej opcji: przechowywanie zaszyfrowanego rozwiązania w źródle i obliczanie skrótu za każdym razem, gdy użytkownik zgadnie. Aby to zrobić w javascript, jest biblioteka crypto-js pod adresem http://code.google.com/p/crypto-js/ . W systemie Android użyj funkcji MessageDigest . Istnieje aplikacja (na fdroid / github) o nazwie HashPass, która to robi.
Odpowiedzi:
Masz co najmniej dwie opcje, w zależności od problemu, który chcesz rozwiązać.
Jeśli chcesz, aby niewinni czytelnicy twojego kodu nie otrzymali nieumyślnie odpowiedzi, lub przynajmniej sprawisz, że będzie to trochę trudne, aby użytkownicy nie ulegali pokusie, możesz zaszyfrować rozwiązania i przechowywać klucz jako część kodu, być może wynik niektórych obliczeń (aby uczynić to jeszcze trudniejszym).
Jeśli chcesz uniemożliwić użytkownikom uzyskanie odpowiedzi, możesz użyć funkcji jednokierunkowej lub, w żargonie komputerowym, funkcji skrótu . Przechowywanie hash odpowiedź, i można sprawdzić, czy odpowiedź jest prawidłowa bez możliwości wydedukować odpowiedź w ogóle bez znalezienia go w pierwszej kolejności. Ma to tę wadę, że trudniej jest znaleźć odpowiedź zbliżoną do poprawnej, chociaż istnieją pewne rozwiązania nawet tego problemu.
źródło
Masz
dwietrzy opcje:Zachowaj odpowiedzi oddzielnie od reszty kodu źródłowego
Jeśli chcesz, aby Twój kod był open source, jednak nie chcesz, aby odpowiedzi były open source, to możesz otworzyć kod źródłowy aplikacji bez pytań i odpowiedzi, przy czym pytania i odpowiedzi są osobną „wtyczką” zamkniętego źródła. lub plik danych. Twoja aplikacja na Androida połączy oba te elementy w jedną aplikację.
Umieść odpowiedzi w kodzie źródłowym
Ewentualnie, jeśli uważasz, że pytania i odpowiedzi są kluczową częścią tego, co chcesz, aby były dostępne, należy umieścić odpowiedzi w kodzie źródłowym, najlepiej nie zaciemniać, aby inni mogli je przeczytać i zmodyfikować . Zaciemnianie kodu źródłowego, aby nie można go było zrozumieć i zmodyfikować, nie jest tak naprawdę zgodne z zasadami otwartego kodu źródłowego.
Umieść odpowiedzi na serwerze w Internecie
Dzięki obu powyższym rozwiązaniom osoba, która pobrała aplikację, może znaleźć odpowiedzi bez odtwarzania programu w obu przypadkach - bez względu na to, jak zaciemnisz / zaszyfrujesz swoje odpowiedzi, jeśli Twój program może zidentyfikować odpowiedź bez dodatkowych informacji, więc może człowiek sprawdzający twoją skompilowaną aplikację.
Jeśli naprawdę chcesz się upewnić, że nikt nie może znaleźć odpowiedzi, jedyną prawdziwą opcją jest nie dać im odpowiedzi i wezwać aplikację do usługi internetowej itp., Ilekroć chcą poznać odpowiedź. Aplikacja powinna wysłać odpowiedź, którą podał użytkownik, a usługa internetowa powinna powiedzieć aplikacji, czy odpowiedź jest poprawna, w ten sposób użytkownik nie będzie w stanie powiedzieć, jaka jest odpowiedź, dopóki nie uzyska poprawnej odpowiedzi (krótka brutalnego wymuszania usługi internetowej, którą można wykryć i chronić przed nią).
Jeśli szukasz sposobów zaciemnienia swoich odpowiedzi, to sugeruje mi, że tak naprawdę nie chcesz w ogóle otwierać swoich źródeł, więc powinieneś rozważyć pierwsze opcje.
Jeśli jest to krytyczny , że użytkownik nie będzie w stanie znaleźć odpowiedź z góry następnie trzecia opcja to jedyny prawdziwy wybór, ale jestem stara się myśleć o sytuacji, w której byłoby to warte wysiłku, choćby dlatego, że uniemożliwia użytkownikom z korzystania z aplikacji bez połączenia z Internetem.
źródło
Jeśli celem jest zasłonięcie ciągów przed przypadkowym odczytaniem kodu źródłowego, ale utrzymanie ich otwartości, aby inni ludzie mogli łatwo wprowadzić własne zmiany - na przykład, jeśli publikujesz źródło w przygodzie tekstowej i nie chcesz, aby pojawiał się tekst opisowy który stanowiłby spoiler, a następnie użyłby czegoś odwracalnego, takiego jak zgnilizna.
W rzeczywistości możesz zepsuć 13 wszystkich plików tłumaczeń i odwrócić je w locie.
To utrzymuje otwartego ducha. Losowe „magiczne” skróty nie są tak naprawdę przyjazne programistom.
źródło
Otwarte źródło wymaga podania kodu źródłowego do publicznej wiadomości i udostępnienia go, a nie danych gry. Możesz więc łatwo umieścić dane w innym pliku i nie publikować tego. Dodaj krypto, jeśli chcesz zapobiec przypadkowemu odczytaniu pliku. Wątpię, aby do twojej aplikacji potrzebny był silny szyfr.
źródło
Dlaczego przechowujesz swoje odpowiedzi w kodzie źródłowym GPL, jeśli nie chcesz, aby użytkownicy je znali? Nawet jeśli nie są one obecnie znane lub łatwo można je rozdzielić, mogą (i prawdopodobnie będą) istnieć w przyszłości.
Zamiast przechowywać je w aplikacji, użyj zewnętrznej bazy danych. Stwórz małą usługę internetową, która porównuje odpowiedzi z zawartością bazy danych. Następnie pozwól swojej aplikacji nawiązać połączenie z tą usługą internetową, ilekroć będzie musiała to zweryfikować. Głównym problemem jest to, że ponieważ wymaga dostępu do Internetu, stracisz trochę prędkości i potencjalnej bazy użytkowników. Twoja licencja na aplikację powinna mieć zastosowanie tylko do samej aplikacji, a nie do usługi internetowej.
Możesz także umieścić swoje odpowiedzi w małej bazie danych i umieścić je w swoim programie. O ile mi wiadomo, GPL dotyczy tylko kodu źródłowego, a nie danych przechowywanych przez Twoją aplikację. Mogę się jednak mylić.
źródło
Pamiętaj, że nawet jeśli przechowujesz bazę danych na zdalnym serwerze WWW, bazę danych nadal można powielić, po prostu zapisując wszystkie poprawne pary klucz / wartość, które były widoczne. Mówiąc ogólnie, aplikacje mobilne powinny starać się nie zgłaszać błędów lub przestać działać, ponieważ sieć nie działa (używaj wiadomości w kolejce i „aktualizuj, kiedy możesz”).
Jeśli więc chcesz mieć lokalną bazę danych, ale nie podoba ci się pomysł jej rażącego odszyfrowania, możesz użyć filtra Bloom (aby uniknąć rozmowy z siecią lub posiadania dużej odszyfrowanej bazy danych lokalnie). Tak działały sprawdzania pisowni, gdy przestrzeń pamięci była naprawdę mała.
Jeśli dodasz do pytania pary pytanie / odpowiedź, takie jak:
Jeśli zapytasz, czy „Capitol of Virginia? Richmond” jest w zestawie, odpowie albo „zdecydowanie nie”, albo „prawie na pewno tak”. Jeśli otrzymasz zbyt wiele wyników fałszywie dodatnich, powiększ bazę danych.
Możesz mieć ogromną bazę danych w niewielkiej przestrzeni, zakładając, że użytkownik przeliteruje pytanie i odpowiedź dokładnie tak, jak się spodziewasz. Utrzymywanie małej bazy danych pomaga w aktualizacjach, ponieważ prawdopodobnie muszą być przesyłane przez sieci bezprzewodowe.
źródło