He terminado de desarrollar una aplicación para Android y tengo la intención de publicarla con GPL. Quiero que sea de código abierto. Sin embargo, la naturaleza de la aplicación (un juego) es que hace acertijos y tiene las respuestas codificadas en el recurso de cadena. ¡No puedo publicar las respuestas! Me dijeron que buscara almacenar contraseñas de forma segura, pero no he encontrado nada apropiado.
¿Es posible publicar mi código fuente con una matriz de cadenas oculta, encriptada u oculta? ¿Quizás leyendo las respuestas de una base de datos en línea?
Actualizar
La solución de Yuval Filmus a continuación funcionó. Cuando lo leí por primera vez, todavía no estaba seguro de cómo hacerlo. Encontré algunas soluciones para la segunda opción: almacenar la solución hash en la fuente y calcular el hash cada vez que el usuario adivina. Para hacer esto en javascript, existe la biblioteca crypto-js en http://code.google.com/p/crypto-js/ . Para Android, use la función MessageDigest . Hay una aplicación (en fdroid / github) llamada HashPass que hace esto.
Respuestas:
Tiene al menos dos opciones, según el problema que desee resolver.
Si desea que lectores inocentes de su código no obtengan las respuestas inadvertidamente, o al menos quiere que sea un poco difícil para que los usuarios no se vean tentados, puede cifrar las soluciones y almacenar la clave como parte de su código, tal vez un resultado de algún cálculo (para hacerlo aún más difícil).
Si desea evitar que los usuarios recuperen la respuesta, puede usar una función unidireccional o, en la jerga de la computadora, una función hash . Almacenar un hash de la respuesta, y que se puede comprobar si la respuesta es correcta, sin que sea posible deducir la respuesta en absoluto sin encontrar primero. Esto tiene la desventaja de que es más difícil buscar una respuesta que esté cerca de la respuesta correcta, aunque hay algunas soluciones incluso para este problema.
fuente
Tienes
dostres opciones:Mantenga las respuestas separadas del resto del código fuente.
Si desea que su código sea de código abierto, sin embargo, no desea que las respuestas sean de código abierto, entonces abra el código de la aplicación sin las preguntas y respuestas, siendo las preguntas y las respuestas un "complemento" de código cerrado separado o archivo de datos. Su aplicación de Android los agruparía en una sola aplicación.
Pon las respuestas en tu código fuente
Alternativamente, si considera que las preguntas y respuestas son una parte central de lo que desea de código abierto, entonces debe poner las respuestas en el código fuente, preferiblemente sin ofuscar para que otros puedan leerlas y modificarlas . Ofuscar el código fuente para que no se pueda entender y modificar no está realmente de acuerdo con los principios del código fuente abierto.
Pon las respuestas en un servidor en internet
Con las dos soluciones anteriores es posible que alguien que haya descargado su aplicación encuentre las respuestas sin reproducir su programa en ninguno de los casos, sin importar cómo ofusque / encripte sus respuestas, si su programa puede identificar la respuesta sin información adicional, entonces ¿Puede un humano examinar su aplicación compilada?
Si realmente quiere asegurarse de que nadie pueda encontrar las respuestas, entonces la única opción real es no darles las respuestas y hacer que la aplicación llame a un servicio web, etc., siempre que quieran saber la respuesta. La aplicación debe enviar la respuesta que el usuario ha ingresado y el servicio web debe decirle a la aplicación si la respuesta es correcta o no, de esa manera el usuario no tiene forma de decir cuál es la respuesta hasta que ya tenga la respuesta correcta (breve de forzar al servicio web, que puede detectar y proteger).
Si está buscando formas de ofuscar sus respuestas, eso me sugiere que realmente no desea abrir sus respuestas en primer lugar, por lo que debe considerar las primeras opciones.
Si es crítico que el usuario no pueda encontrar la respuesta por adelantado, entonces la tercera opción es su única opción real, sin embargo, me cuesta pensar en un escenario en el que valga la pena el esfuerzo, sobre todo porque impide que sus usuarios de usar su aplicación sin una conexión a Internet.
fuente
Si el objetivo es ocultar las cadenas de la lectura casual del código fuente pero mantenerlas abiertas para que otras personas puedan hacer sus propios cambios fácilmente, por ejemplo, si estaba publicando la fuente en una aventura de texto y no quería que apareciera ningún texto descriptivo lo que constituiría un spoiler, luego usa algo reversible como rot13.
De hecho, podría descomponer 13 todos sus archivos de traducción y voltearlos sobre la marcha.
Eso es mantener el espíritu abierto. Los hashes aleatorios "mágicos" no son realmente amigables para los programadores.
fuente
El código abierto requiere que el código fuente se haga público y esté disponible, no los datos del juego. Por lo tanto, podría poner fácilmente los datos en otro archivo y no publicarlo. Agregue algunas criptomonedas si desea evitar la lectura casual del archivo. Dudo que sea necesaria una criptografía fuerte para su aplicación.
fuente
¿Por qué almacenaría sus respuestas en su código fuente GPL si no desea que sus usuarios las conozcan? Incluso si no se conocen o son fáciles de descifrar ahora, pueden (y probablemente lo serán) en el futuro.
En lugar de almacenarlos en su aplicación, use una base de datos externa. Haga un pequeño servicio web que compare las respuestas con lo que hay en su base de datos. Luego, deje que su aplicación realice una llamada a ese servicio web siempre que tenga que verificar. El principal problema es que, dado que requiere acceso a Internet, perderá algo de velocidad y una base de usuarios potenciales. la licencia de su aplicación solo debe solicitar la aplicación en sí, no el servicio web.
También puede poner sus respuestas en una pequeña base de datos y ponerlas en su programa. Hasta donde sé, GPL solo se aplica al código fuente, no a los datos que almacena su aplicación. Sin embargo, podría estar equivocado en eso.
fuente
Recuerde que incluso si almacena una base de datos en un servidor web remoto, la base de datos puede duplicarse simplemente escribiendo todos los pares de clave / valor correctos que se hayan visto. Y en términos generales, las aplicaciones móviles deberían tratar de no dar errores o dejar de funcionar porque la red está inactiva (use mensajes en cola y "actualice cuando pueda").
Entonces, si desea una base de datos local, pero no le gusta la idea de que se descifre descaradamente, puede usar un filtro de floración (para evitar hablar con una red o tener una gran base de datos descifrada localmente). Así es como funcionaban los correctores ortográficos cuando el espacio de memoria era realmente escaso.
Entonces, si agrega pares de preguntas / respuestas en el filtro como:
Si pregunta si "Capitol of Virginia? Richmond" está en el set, responderá "definitivamente no" o "casi seguro que sí". Si obtiene demasiados falsos positivos, amplíe la base de datos.
Puede tener una inmensa base de datos en un espacio pequeño, suponiendo que el usuario deletree la pregunta y la respuesta exactamente como espera. Mantener la base de datos pequeña ayuda con las actualizaciones, porque probablemente tengan que transferirse a través de redes inalámbricas.
fuente