Eu tenho um projeto de código aberto que carrega arquivos para o DropBox entre vários hosts de arquivos. No momento, estou raspando a tela do DropBox. Para usar sua API, preciso codificar uma CHAVE SECRETA fornecida por eles para autenticação OAuth. Mas receio que a chave não seja secreta se for visível claramente para qualquer um ver.
É 'possível' que alguém mal-intencionado use minha chave para fazer upload de um vírus para a conta de um usuário (que já permitiu o acesso ao meu aplicativo) que se espalhará para o PC (se a sincronização da área de trabalho estiver ativada) e para o PC de outras pessoas (se eles tinham pastas compartilhadas) e assim por diante. : O
Eu encontrei esta pergunta sem resposta que tem o mesmo problema que o meu.
Mas eu gostaria de saber em geral como esconderíamos dados confidenciais em um projeto de código aberto.
Eu tenho uma ideia.
- Tenha um espaço reservado no código-fonte como "<SECRET KEY HERE>" e preencha-o apenas ao criar o binário para liberação? (que nojo!)
Alguma ideia decente?
fonte
Respostas:
A idéia básica é que você NÃO faça check-in de valores confidenciais no código ou no binário compilado. Especialmente se o projeto é de código aberto, você realmente não deveria. Existem várias estratégias de configuração que você pode seguir para fazer isso:
Espaços reservados no código (valores codificados)
Espaços reservados no código - como sugerido - o que é mais sensato e fácil de fazer em linguagens de programação dinâmicas, pois o código é fácil de alterar (sem a necessidade de compilar). Eu já vi muitos projetos de código aberto fazendo isso, como o MediaWiki
LocalSettings.php
.A desvantagem dessa estratégia é que a chave está codificada. Portanto, se o programa é distribuído como um binário, ter a chave codificada não o torna particularmente sustentável.
Arquivos de texto de configuração
Você também pode fazer isso implementando arquivos de texto de configuração , ou seja, o programa / aplicativo procura um arquivo de configuração e lê valores a partir dele. Você pode fazer check-in de uma configuração de amostra com espaços reservados, mas ter a configuração real local em sua máquina.
No seu caso, você pode criar um
key.conf
arquivo de texto com a chave real, deixar o programa usar esse arquivo e ser ignorado pelo controle de versão. Você pode, por ser útil, fazer check-in de umkey.conf.example
arquivo de texto com uma chave falsa e fazer o check-in. Verifique se o seu programa / aplicativo envia uma mensagem de erro útil para o usuário adicionar a chave real no arquivo correto.Algumas linguagens de programação possuem APIs que fornecem isso automaticamente para você, como:
App.Config
arquivos acessíveis pela API do ConfigurationManager .NETpackage.json
colocar valores de configuração nos arquivos json e, com a API dos módulos de arquivo, os arquivos são fáceis de analisar e usar, pois são basicamente literais de objetos JavaScript .Se seu aplicativo for um aplicativo de banco de dados, considere colocar a chave ou outras variáveis de configuração no banco de dados. É o mesmo que o arquivo de texto de configuração acima, mas você coloca todas as variáveis de configuração, como a chave em uma tabela de banco de dados.
Através da visualização de preferências ou de um aplicativo Back Office
Se o programa for uma janela ou um aplicativo da Web com visualizações, você também poderá permitir que o aplicativo crie o arquivo de configuração, através de uma espécie de visualização de preferências. Dessa forma, você não precisa verificar um arquivo de configuração de exemplo, como sugerido acima.
O MediaWiki resolveu isso da mesma forma gerando automaticamente o
LocalSettings.php
arquivo em um processo de instalação inicial.É certo que essa não é uma opção para programas executados apenas como processos, serviços ou daemons em segundo plano. No entanto, é por isso que você cria projetos de GUI separados para criar um ponto de entrada para configurações de administração e preferências, em aplicativos Web geralmente chamados de aplicativo Back Office .
fonte
A maneira mais fácil é simplesmente não publicar dados confidenciais. Algumas opções:
Usei a segunda opção para o desenvolvimento de código aberto, porque significa que você não precisa se preocupar em preencher os detalhes imediatamente antes da compilação ou em fazer uma alteração para não se comprometer.
fonte
Se alguém tiver o código-fonte (ou código de bytes que pode ter engenharia reversa), poderá obter a chave secreta executando o código em um depurador e colocando um ponto de interrupção no ponto em que você envia a chave.
Você pode dificultar um pouco o fornecimento de uma biblioteca C pré-compilada que fala em drop box, com a chave codificada, mas ainda existem muitas maneiras pelas quais as chaves vazam (estou pensando em strings, por exemplo).
A única maneira segura de pensar em fazer isso é fornecer um serviço da Web que faça a postagem na caixa suspensa. Dessa forma, a chave secreta permanece no seu servidor sob seu controle. Os custos de hospedagem e largura de banda significam que esta solução é inferior ao ideal para um aplicativo gratuito, mas o bônus adicional é que o servidor pode autenticar os clientes corretamente antes de retransmitir os arquivos que estão sendo enviados para o dropbox.
fonte