El manejo de las contraseñas en los repositorios se manejaría de diferentes maneras dependiendo de cuál sea su problema exacto.
1. No lo hagas.
Y algunas formas de evitar hacerlo están cubiertas: .gitignore, config.example, etc.
o 2. Hacer que el repositorio sea accesible solo para personas autorizadas
Es decir, personas a las que se les permite conocer la contraseña. chmod
y grupos de usuarios vienen a la mente; ¿También problemas como los empleados de Github o AWS deberían poder ver cosas si aloja sus repositorios o servidores de forma externa?
o 3. Cifre los datos confidenciales (propósito de esta respuesta)
Si desea almacenar sus archivos de configuración que contienen información confidencial (como contraseñas) en una ubicación pública, entonces debe cifrarse. Los archivos pueden descifrarse cuando se recuperan del repositorio, o incluso usarse directamente desde su forma cifrada.
A continuación se muestra un ejemplo de solución de JavaScript para usar datos de configuración cifrados.
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);
Para que pueda recuperar un archivo de configuración cifrado escribiendo solo unas pocas líneas de Javascript.
Tenga en cuenta que poner un archivo config.RSA
en un repositorio de git lo convertiría efectivamente en un archivo binario y, por lo tanto, perdería muchos de los beneficios de algo como Git, por ejemplo, la capacidad de elegir cambios en él.
La solución a eso podría ser encriptar pares de valores clave o quizás solo valores. Puede encriptar todos los valores, por ejemplo, si tiene un archivo separado para información confidencial, o encriptar solo los valores sensibles si tiene todos los valores en un archivo. (vea abajo)
Mi ejemplo anterior es un poco inútil para cualquiera que quiera hacer una prueba con él, o como un ejemplo para comenzar, ya que supone la existencia de algunas claves RSA y un archivo de configuración cifrado config.RSA
.
Aquí hay algunas líneas adicionales de código agregadas para crear claves RSA y un archivo de configuración para jugar.
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);
Cifrar solo valores
fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');
Puede descifrar un archivo de configuración con valores cifrados usando algo como esto.
const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});
Con cada elemento de configuración en una línea separada (por ejemplo, Hello
y Goodbye
superior), Git reconocerá mejor lo que está sucediendo en un archivo y almacenará los cambios en los elementos de información como diferencias en lugar de archivos completos. Git también podrá gestionar fusiones y selecciones de cerezas, etc. mejor.
Sin embargo, cuanto más desee controlar los cambios de versión a información confidencial, más se moverá hacia una solución de REPOSITORIO SEGURO (2) y más lejos de una solución de INFORMACIÓN ENCRITADA (3).