Работа с паролями в репозиториях будет обрабатываться различными способами в зависимости от вашей конкретной проблемы.
1. Не делай этого.
И способы избежать этого описаны в некоторых ответах - .gitignore, config.example и т. Д.
или 2. Сделать репозиторий доступным только для авторизованных людей.
Т.е. люди, которым разрешено знать пароль. chmod
и группы пользователей приходят на ум; также такие проблемы, как следует ли разрешать сотрудникам Github или AWS видеть вещи, если вы размещаете свои репозитории или серверы извне?
или 3. зашифровать конфиденциальные данные (цель этого ответа)
Если вы хотите хранить свои файлы конфигурации, содержащие конфиденциальную информацию (например, пароли), в общедоступном месте, то их необходимо зашифровать. Файлы могут быть расшифрованы при восстановлении из хранилища или даже использованы прямо из зашифрованной формы.
Пример решения javascript для использования зашифрованных данных конфигурации показан ниже.
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);
Таким образом, вы можете восстановить зашифрованный файл конфигурации, написав всего несколько строк Javascript.
Обратите внимание, что помещение файла config.RSA
в репозиторий git фактически сделает его бинарным файлом, и поэтому оно утратит многие преимущества чего-то вроде Git, например, возможность выбирать изменения в нем.
Решением этой проблемы может быть шифрование пар ключ-значение или, возможно, просто значений. Вы можете зашифровать все значения, например, если у вас есть отдельный файл для конфиденциальной информации, или зашифровать только конфиденциальные значения, если у вас есть все значения в одном файле. (увидеть ниже)
Мой пример, приведенный выше, немного бесполезен для тех, кто хочет провести с ним тест или в качестве примера для начала, поскольку он предполагает наличие некоторых ключей RSA и зашифрованного файла конфигурации config.RSA
.
Итак, вот несколько дополнительных строк кода, добавленных для создания ключей RSA и файла конфигурации для воспроизведения.
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);
Только шифрование значений
fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');
Вы можете расшифровать файл конфигурации с зашифрованными значениями, используя что-то вроде этого.
const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});
С каждым элементом конфигурации в отдельной строке (например, Hello
и Goodbye
выше), Git будет лучше распознавать, что происходит в файле, и будет сохранять изменения в элементах информации как различия, а не полные файлы. Git также сможет лучше управлять слияниями, выбором вишни и т.д.
Однако чем больше вы хотите, чтобы управление версиями изменяло конфиденциальную информацию, тем больше вы переходите к решению БЕЗОПАСНОЕ ХРАНИЛИЩЕ (2) и от решения ЗАКРЫТЫЙ ИНФО (3).