Radzenie sobie z hasłami w repozytoriach byłoby obsługiwane na różne sposoby, w zależności od konkretnego problemu.
1. Nie rób tego.
Sposoby unikania tego są opisane w niektórych odpowiedziach - .gitignore, config.example itp
lub 2. Udostępnij repozytorium tylko upoważnionym osobom
To znaczy ludzie, którzy mogą znać hasło. chmod
i przychodzą na myśl grupy użytkowników; także problemy, takie jak czy pracownicy Github lub AWS powinni mieć możliwość przeglądania rzeczy, jeśli przechowujesz swoje repozytoria lub serwery na zewnątrz?
lub 3. Zaszyfruj wrażliwe dane (cel tej odpowiedzi)
Jeśli chcesz przechowywać pliki konfiguracyjne zawierające poufne informacje (takie jak hasła) w miejscu publicznym, musisz je zaszyfrować. Pliki można odszyfrować po odzyskaniu z repozytorium, a nawet użyć bezpośrednio z ich zaszyfrowanej postaci.
Przykładowe rozwiązanie javascript do korzystania z zaszyfrowanych danych konfiguracyjnych pokazano poniżej.
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);
Możesz więc odzyskać zaszyfrowany plik konfiguracyjny zapisujący zaledwie kilka wierszy Javascript.
Zauważ, że umieszczenie pliku config.RSA
w repozytorium git skutecznie uczyniłoby go plikiem binarnym, a zatem straciłoby wiele korzyści z czegoś takiego jak Git, np. Zdolność do wybierania w nim zmian.
Rozwiązaniem tego może być zaszyfrowanie par kluczy lub wartości. Możesz zaszyfrować wszystkie wartości, na przykład jeśli masz osobny plik dla poufnych informacji, lub zaszyfrować tylko wrażliwe wartości, jeśli masz wszystkie wartości w jednym pliku. (patrz poniżej)
Mój powyższy przykład jest nieco bezużyteczny dla każdego, kto chce z nim wykonać test lub jako przykład na początek, ponieważ zakłada istnienie niektórych kluczy RSA i zaszyfrowanego pliku konfiguracyjnego config.RSA
.
Oto kilka dodatkowych wierszy kodu dodanych do tworzenia kluczy RSA i pliku konfiguracyjnego do zabawy.
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);
Tylko szyfrowanie wartości
fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');
Możesz odszyfrować plik konfiguracyjny z zaszyfrowanymi wartościami, używając czegoś takiego.
const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});
Z każdym elementem konfiguracji w osobnym wierszu (np. Hello
I Goodbye
wyżej) Git lepiej rozpozna, co się dzieje w pliku, i zapisze zmiany w elementach informacji jako różnice, a nie pełne pliki. Git będzie również w stanie lepiej zarządzać połączeniami i typami wiśni itp.
Jednak im bardziej chcesz kontrolować zmiany wersji wrażliwych informacji, tym bardziej zbliżasz się do rozwiązania BEZPIECZNA REPOZYTORIUM (2) i odejdziesz od rozwiązania ZASZYFROWANE INFORMACJE (3).