Concluí o desenvolvimento de um aplicativo para Android e pretendo publicá-lo com a GPL - quero que ele seja de código aberto. No entanto, a natureza do aplicativo (um jogo) é que ele pede enigmas e tem as respostas codificadas no recurso de sequência. Não consigo publicar as respostas! Disseram-me para procurar armazenar senhas com segurança - mas não encontrei nada apropriado.
É possível publicar meu código-fonte com uma matriz de strings oculta, criptografada ou obscurecida? Talvez lendo as respostas de um banco de dados online?
Atualizar
A solução de Yuval Filmus abaixo funcionou. Quando o li pela primeira vez, eu ainda não tinha certeza de como fazê-lo. Encontrei algumas soluções para a segunda opção: armazenar a solução hash na fonte e calcular o hash toda vez que o usuário adivinhar. Para fazer isso em javascript, existe a biblioteca crypto-js em http://code.google.com/p/crypto-js/ . Para Android, use a função MessageDigest . Existe um aplicativo (no fdroid / github) chamado HashPass que faz isso.
Respostas:
Você tem pelo menos duas opções, dependendo do problema que deseja resolver.
Se você deseja que leitores inocentes do seu código não obtenham as respostas inadvertidamente, ou pelo menos queira torná-lo um pouco difícil para que os usuários não sejam tentados, você pode criptografar as soluções e armazenar a chave como parte do seu código, talvez um resultado de alguma computação (para tornar ainda mais difícil).
Se você deseja impedir que os usuários recuperem a resposta, use uma função unidirecional ou, no jargão do computador, uma função hash . Armazene um hash da resposta e você poderá testar se a resposta está correta, sem que seja possível deduzir a resposta , sem encontrá-la primeiro. Isso tem a desvantagem de que é mais difícil procurar por uma resposta próxima da resposta correta, embora existam algumas soluções para esse problema.
fonte
Você tem
duastrês opções:Mantenha as respostas separadas do restante do código-fonte
Se você deseja que seu código seja de código aberto, no entanto, não deseja que as respostas sejam de código aberto, abra o código do aplicativo sem as perguntas e respostas, com as perguntas e as respostas sendo um "plugin" de código fechado separado ou arquivo de dados. Seu aplicativo para Android agruparia esses dois em um único aplicativo.
Coloque as respostas no seu código fonte
Como alternativa, se você considera as perguntas e as respostas uma parte essencial do que deseja código aberto, deve colocar as respostas no código-fonte, de preferência sem ofuscamento, para que outras pessoas possam lê-las e modificá-las . Ofuscar o código-fonte para que não possa ser entendido e modificado não está de acordo com os princípios do código-fonte aberto.
Coloque as respostas em um servidor na internet
Com as duas soluções acima, é possível que alguém que baixou seu aplicativo encontre as respostas sem reproduzir o programa em ambos os casos - não importa como você ofusca / criptografa suas respostas, se o seu programa puder identificar a resposta sem informações adicionais, portanto um humano pode examinar seu aplicativo compilado.
Se você realmente quer ter certeza de que ninguém pode descobrir as respostas, a única opção real é não dar as respostas e solicitar que o aplicativo chame um serviço da web etc ... sempre que quiser saber a resposta. O aplicativo deve enviar a resposta que o usuário digitou e o serviço da Web deve informar ao aplicativo se a resposta está correta ou não, para que o usuário não tenha como saber qual é a resposta até que já tenha a resposta correta (breve forçar brutalmente o serviço da Web, contra o qual você pode detectar e proteger).
Se você está procurando maneiras de ofuscar suas respostas, isso sugere que você realmente não deseja abrir suas respostas em código-fonte, portanto, considere as primeiras opções.
Se é fundamental que o usuário não consiga encontrar a resposta com antecedência, a terceira opção é sua única opção real, no entanto, estou lutando para pensar em um cenário em que isso valha a pena, principalmente porque impede seus usuários. de usar seu aplicativo sem uma conexão com a Internet.
fonte
Se o objetivo é ocultar as seqüências de caracteres da leitura casual do código-fonte, mas mantê-las abertas para que outras pessoas possam fazer suas próprias alterações com facilidade - por exemplo, se você estivesse publicando a fonte em uma aventura de texto e não quisesse que nenhum texto descritivo aparecesse que constituiria um spoiler, então use algo reversível como rot13.
Na verdade, você pode rotear todos os seus arquivos de tradução e devolvê-los rapidamente.
Isso está mantendo o espírito aberto. Os hashes "mágicos" aleatórios não são realmente adequados para programadores.
fonte
O código-fonte aberto exige que o código-fonte seja tornado público e disponível, não os dados do jogo. Portanto, você pode facilmente colocar os dados em outro arquivo e não publicá-lo. Adicione um pouco de criptografia se desejar impedir a leitura casual do arquivo. Duvido que uma criptografia forte seja necessária para sua aplicação.
fonte
Por que você armazenaria suas respostas no código-fonte GPL se não deseja que seus usuários as conheçam? Mesmo se não forem conhecidos ou facilmente quebráveis agora, eles podem (e provavelmente serão) estar no futuro.
Em vez de armazená-los no seu aplicativo, use um banco de dados externo. Faça um pequeno serviço da Web que compare as respostas com o que está no seu banco de dados. Em seguida, deixe seu aplicativo fazer uma chamada para esse serviço da Web sempre que for necessário verificar. O principal problema é que, por exigir acesso à Internet, você perderá velocidade e potencial base de usuários. sua licença do aplicativo deve se candidatar apenas ao aplicativo em si, não ao serviço da web.
Você também pode colocar suas respostas em um pequeno banco de dados e colocá-las em seu programa. Até onde eu sei, a GPL se aplica apenas ao código-fonte, não a quaisquer dados que seu aplicativo armazena. Eu posso estar errado nisso, no entanto.
fonte
Lembre-se de que, mesmo que você armazene um banco de dados em um servidor da Web remoto, o banco de dados ainda poderá ser duplicado, simplesmente anotando todos os pares corretos de chave / valor que foram vistos. E, de um modo geral, os aplicativos móveis devem tentar não cometer erros ou deixar de funcionar porque a rede está inoperante (use mensagens em fila e "atualize quando puder").
Portanto, se você deseja um banco de dados local, mas não gosta da ideia de que ele seja descriptografado descaradamente, use um filtro de bloom (para evitar falar com uma rede ou ter um grande banco de dados descriptografado localmente). É assim que os corretores ortográficos costumavam funcionar quando o espaço da memória era muito pequeno.
Portanto, se você adicionar pares de perguntas / respostas ao filtro, como:
Se você perguntar se "Capitólio da Virgínia? Richmond" está no set, ele responderá "definitivamente não" ou "quase certamente sim". Se você receber muitos falsos positivos, aumente o banco de dados.
Você pode ter um imenso banco de dados em um espaço minúsculo, supondo que o usuário escreva a pergunta e a resposta exatamente como você espera. Manter o banco de dados pequeno ajuda nas atualizações, porque elas provavelmente precisam ser transferidas por redes sem fio.
fonte