Робота з паролями в сховищах оброблятиметься різними способами залежно від вашої конкретної проблеми.
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).