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?


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 .


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.