Lidar com senhas em repositórios seria tratado de maneiras diferentes, dependendo do seu problema exato.
1. Não faça isso.
E maneiras de evitar fazer isso são cobertas em algumas respostas - .gitignore, config.example, etc
ou 2. Tornar o repositório acessível apenas a pessoas autorizadas
Ou seja, pessoas que têm permissão para saber a senha. chmod
grupos de usuários vem à mente; também problemas como os funcionários do Github ou da AWS podem ver coisas se você hospedar seus repositórios ou servidores externamente?
ou 3. Criptografar os dados confidenciais (objetivo desta resposta)
Se você deseja armazenar seus arquivos de configuração que contêm informações confidenciais (como senhas) em um local público, ele precisa ser criptografado. Os arquivos podem ser descriptografados quando recuperados do repositório, ou mesmo usados diretamente de sua forma criptografada.
Um exemplo de solução javascript para usar dados de configuração criptografados é mostrado abaixo.
const fs = require('fs');
const NodeRSA = require('node-rsa');
let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));
const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');
console.log('decrypted: ', config);
Assim, você pode recuperar um arquivo de configuração criptografado escrevendo apenas algumas linhas de Javascript.
Observe que colocar um arquivo config.RSA
em um repositório git o tornaria efetivamente um arquivo binário e, portanto, perderia muitos dos benefícios de algo como o Git, por exemplo, a capacidade de escolher as mudanças nele.
A solução para isso pode ser criptografar pares de valores-chave ou talvez apenas valores. Você pode criptografar todos os valores, por exemplo, se tiver um arquivo separado para informações confidenciais, ou criptografar apenas os valores confidenciais se tiver todos os valores em um arquivo. (ver abaixo)
Meu exemplo acima é um pouco inútil para quem deseja fazer um teste com ele, ou como um exemplo para começar, pois assume a existência de algumas chaves RSA e um arquivo de configuração criptografado config.RSA
.
Então, aqui estão algumas linhas de código extras adicionadas para criar chaves RSA e um arquivo de configuração para brincar.
const fs = require('fs');
const NodeRSA = require('node-rsa');
/////////////////////////////
// Generate some keys for testing
/////////////////////////////
const examplekey = new NodeRSA({b: 2048});
fs.writeFileSync('private.key', examplekey.exportKey('pkcs8-private'));
fs.writeFileSync('public.key', examplekey.exportKey('pkcs8-public'));
/////////////////////////////
// Do this on the Machine creating the config file
/////////////////////////////
const configToStore = {Goodbye: 'Cruel world'};
let publickey = new NodeRSA();
publickey.importKey(fs.readFileSync('public.key', 'utf8'));
fs.writeFileSync('config.RSA', publickey.encrypt(configToStore, 'base64'), 'utf8');
/////////////////////////////
// Do this on the Machine consuming the config file
/////////////////////////////
let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));
const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');
console.log('decrypted: ', config);
Criptografando apenas valores
fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');
Você pode descriptografar um arquivo de configuração com valores criptografados usando algo como isto.
const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});
Com cada item de configuração em uma linha separada (por exemplo, Hello
e Goodbye
acima), Git irá reconhecer melhor o que está acontecendo em um arquivo e armazena alterações nos itens de informação como as diferenças ao invés de arquivos completos. O Git também será capaz de gerenciar fusões e escolhas de cereja, etc.
No entanto, quanto mais o controle de versão for alterado para informações confidenciais, mais você estará caminhando para uma solução de REPOSITÓRIO SEGURO (2) e se afastando de uma solução de INFO ENCRYPTED (3).