Como ocultar dados confidenciais no meu projeto de código aberto?

13

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?

Vigneshwaran
fonte
1
Essa é realmente a única maneira segura de fazer isso. Você também pode usar a criptografia pgp para codificar sua chave secreta, e somente você poderá decodificá-la, mas por que se incomodar em publicá-la?
Prescott
Talvez queira dar uma olhada nesta pergunta: programmers.stackexchange.com/questions/180957/… - não se trata de chaves da API do DropBox, mas a mensagem geral é a mesma.
tdammers
O git-crypt foi feito para você :) github.com/AGWA/git-crypt
nha

Respostas:

14

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.confarquivo 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 um key.conf.examplearquivo 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:

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.phparquivo 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 .

Spoike
fonte
Uma coisa a observar aqui: fazer com que o próprio aplicativo modifique suas próprias definições de configuração significa que o arquivo de configurações deve ser gravável pelo usuário do aplicativo, o que aumenta a superfície de ataque, portanto, pense bem se realmente precisa dessa interface do usuário.
tdammers
2

A maneira mais fácil é simplesmente não publicar dados confidenciais. Algumas opções:

  • Use um espaço reservado como na pergunta.
  • Use um arquivo de cabeçalho especialmente para a chave, não o comprometa com o controle de origem e apenas o distribua em particular para partes confiáveis.

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.

Hugo
fonte
2

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.

Michael Shaw
fonte