Saya telah selesai mengembangkan aplikasi untuk Android dan bermaksud untuk menerbitkannya dengan GPL - Saya ingin itu menjadi open source. Namun, sifat aplikasi (permainan) adalah bahwa ia meminta teka-teki dan memiliki kode jawaban ke sumber daya string. Saya tidak dapat mempublikasikan jawabannya! Saya disuruh melihat ke dalam menyimpan kata sandi dengan aman - tetapi saya belum menemukan sesuatu yang sesuai.
Apakah mungkin untuk mempublikasikan kode sumber saya dengan larik string yang disembunyikan, dienkripsi, atau dikaburkan? Mungkin dengan membaca jawaban dari database online?
Memperbarui
Solusi Yuval Filmus di bawah ini berhasil. Ketika saya pertama kali membacanya, saya masih tidak yakin bagaimana melakukannya. Saya menemukan beberapa solusi, untuk opsi kedua: menyimpan solusi hash di sumber dan menghitung hash setiap kali pengguna menebak. Untuk melakukan ini dalam javascript ada perpustakaan crypto-js di http://code.google.com/p/crypto-js/ . Untuk Android, gunakan fungsi MessageDigest . Ada aplikasi (pada fdroid / github) bernama HashPass yang melakukan ini.
Jawaban:
Anda memiliki setidaknya dua opsi, tergantung pada masalah apa yang ingin Anda selesaikan.
Jika Anda ingin pembaca kode Anda yang tidak bersalah tidak mendapatkan jawaban secara tidak sengaja, atau setidaknya Anda ingin membuatnya sedikit sulit sehingga pengguna tidak tergoda, Anda dapat mengenkripsi solusi dan menyimpan kunci sebagai bagian dari kode Anda, mungkin sebuah hasil dari beberapa perhitungan (untuk membuatnya lebih sulit).
Jika Anda ingin mencegah pengguna mengambil jawaban, Anda dapat menggunakan fungsi satu arah, atau dalam jargon komputer, fungsi hash . Simpan hash dari jawabannya, dan mereka dapat Anda uji apakah jawabannya benar tanpa memungkinkan untuk menyimpulkan jawabannya sama sekali tanpa menemukannya terlebih dahulu. Ini memiliki kekurangan bahwa lebih sulit untuk memeriksa jawaban yang dekat dengan jawaban yang benar, meskipun ada beberapa solusi bahkan untuk masalah ini.
sumber
Anda memiliki
duatiga opsi:Pisahkan jawaban dari kode sumber lainnya
Jika Anda ingin kode Anda menjadi open source, namun tidak ingin jawaban menjadi open source, maka Anda open source kode untuk aplikasi tanpa pertanyaan & jawaban, dengan pertanyaan & jawaban menjadi "plugin" sumber tertutup yang terpisah. atau file data. Aplikasi Android Anda akan menggabungkan keduanya menjadi satu aplikasi.
Masukkan jawaban dalam kode sumber Anda
Atau, jika Anda menganggap pertanyaan dan jawaban sebagai bagian inti dari apa yang Anda inginkan bersumber terbuka maka Anda harus memasukkan jawaban ke dalam kode sumber, lebih disukai tidak dikaburkan sehingga orang lain dapat membaca dan memodifikasinya . Mengaburkan kode sumber sehingga tidak dapat dipahami dan dimodifikasi tidak benar-benar sesuai dengan prinsip-prinsip kode sumber terbuka.
Letakkan jawaban di server di internet
Dengan kedua solusi di atas, ada kemungkinan bagi seseorang yang telah mengunduh aplikasi Anda untuk menemukan jawabannya tanpa memainkan program Anda dalam kedua kasus - tidak peduli bagaimana Anda mengaburkan / mengenkripsi jawaban Anda, jika program Anda dapat mengidentifikasi jawaban tanpa informasi tambahan, maka dapat manusia memeriksa aplikasi yang dikompilasi.
Jika Anda benar - benar ingin memastikan bahwa tidak ada yang bisa mengetahui jawabannya maka satu-satunya pilihan nyata adalah tidak memberi mereka jawaban dan meminta aplikasi memanggil layanan web dll ... setiap kali mereka ingin tahu jawabannya. Aplikasi harus mengirim jawaban yang telah dimasukkan pengguna dan layanan web harus memberi tahu aplikasi apakah jawabannya benar atau tidak, sehingga pengguna tidak memiliki cara untuk mengatakan apa jawabannya sampai setelah mereka memiliki jawaban yang benar (singkat). dari memaksa layanan web, yang dapat Anda deteksi dan lindungi).
Jika Anda mencari cara untuk mengaburkan jawaban Anda, yang menunjukkan kepada saya bahwa Anda tidak benar-benar ingin membuka sumber jawaban Anda di tempat pertama, jadi Anda harus mempertimbangkan opsi pertama.
Jika sangat penting bahwa pengguna tidak dapat menemukan jawaban di muka maka opsi ketiga adalah satu-satunya pilihan Anda, namun saya berjuang untuk memikirkan skenario di mana ini sepadan dengan usaha, paling tidak karena itu mencegah pengguna Anda dari menggunakan aplikasi Anda tanpa koneksi internet.
sumber
Jika objeknya adalah untuk mengaburkan string dari pembacaan kasual kode sumber tetapi tetap buka sehingga orang lain dapat dengan mudah membuat perubahan sendiri - misalnya jika Anda menerbitkan sumber ke petualangan teks dan tidak ingin teks deskriptif muncul yang akan membentuk spoiler, kemudian gunakan sesuatu yang dapat dibalik seperti rot13.
Bahkan, Anda dapat memutar semua file terjemahan dan membalikkannya dengan cepat.
Itu menjaga semangat terbuka. Hash "magic" acak tidak benar-benar ramah-programmer.
sumber
Open source membutuhkan kode sumber untuk dipublikasikan dan tersedia, bukan data game. Jadi Anda bisa dengan mudah memasukkan data ke file lain dan tidak mempublikasikannya. Tambahkan beberapa crypto jika Anda ingin mencegah pembacaan file yang biasa saja. Saya ragu crypto yang kuat diperlukan untuk aplikasi Anda.
sumber
Mengapa Anda menyimpan jawaban Anda dalam kode sumber GPL Anda jika Anda tidak ingin pengguna mengetahuinya? Bahkan jika mereka tidak dikenal atau mudah retak sekarang, mereka dapat (dan kemungkinan akan) ada di masa depan.
Alih-alih menyimpannya di aplikasi Anda, gunakan database eksternal. Buat layanan web kecil yang membandingkan jawaban untuk apa yang ada di database Anda. Lalu biarkan aplikasi Anda melakukan panggilan ke layanan web itu setiap kali harus diverifikasi. Masalah utama adalah bahwa, karena memerlukan akses internet, Anda akan kehilangan beberapa kecepatan dan potensi penggunaan. lisensi aplikasi Anda seharusnya hanya berlaku untuk aplikasi itu sendiri, bukan layanan web.
Anda juga bisa memasukkan jawaban Anda ke dalam basis data kecil dan memasukkannya ke dalam program Anda. Sejauh yang saya tahu, GPL hanya berlaku untuk kode sumber, bukan data apa pun yang disimpan aplikasi Anda. Tapi saya mungkin salah tentang itu.
sumber
Ingatlah bahwa bahkan jika Anda menyimpan database di server web jarak jauh, database tersebut masih dapat diduplikasi hanya dengan menuliskan semua pasangan kunci / nilai yang benar yang telah dilihat. Dan secara umum, aplikasi seluler harus mencoba untuk tidak memberikan kesalahan atau berhenti berfungsi karena jaringannya mati (gunakan pesan yang antri, dan "perbarui bila Anda bisa").
Jadi, jika Anda menginginkan database lokal, tetapi tidak suka ide itu didekripsi secara terang-terangan, Anda dapat menggunakan filter bloom (untuk menghindari berbicara dengan jaringan atau memiliki database yang didekripsi secara lokal). Ini adalah bagaimana pemeriksa ejaan digunakan untuk bekerja ketika ruang memori benar-benar ketat.
Jadi, jika Anda menambahkan pasangan pertanyaan / jawaban ke dalam filter seperti:
Jika Anda bertanya apakah "Capitol of Virginia? Richmond" ada di set, itu akan menjawab "pasti tidak", atau "hampir pasti ya". Jika Anda mendapatkan terlalu banyak false positive, maka buat database lebih besar.
Anda bisa memiliki database yang sangat besar di ruang yang kecil, dengan asumsi bahwa pengguna akan mengeja Pertanyaan dan Jawaban persis seperti yang Anda harapkan. Menjaga basis data kecil membantu dengan pembaruan, karena mereka mungkin harus ditransfer melalui jaringan nirkabel.
sumber