Berurusan dengan kata sandi dalam repositori akan ditangani dengan berbagai cara tergantung pada apa masalah Anda sebenarnya.
1. Jangan lakukan itu.
Dan cara untuk menghindari melakukan tercakup dalam beberapa balasan - .gitignore, config.example, dll
atau 2. Membuat repositori hanya dapat diakses oleh orang yang berwenang
Yaitu orang yang diizinkan untuk mengetahui kata sandi. chmod
dan kelompok pengguna muncul di pikiran; juga masalah seperti apakah karyawan Github atau AWS diizinkan untuk melihat sesuatu jika Anda meng-host repositori atau server Anda secara eksternal?
atau 3. Enkripsi data sensitif (tujuan balasan ini)
Jika Anda ingin menyimpan file konfigurasi yang berisi informasi sensitif (seperti kata sandi) di lokasi publik, maka file itu harus dienkripsi. File-file itu dapat didekripsi ketika dipulihkan dari repositori, atau bahkan digunakan langsung dari formulir terenkripsi mereka.
Contoh solusi javascript untuk menggunakan data konfigurasi terenkripsi ditunjukkan di bawah ini.
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);
Jadi, Anda dapat memulihkan file konfigurasi terenkripsi dengan menulis beberapa baris Javascript.
Perhatikan bahwa menempatkan file config.RSA
ke dalam repositori git akan secara efektif menjadikannya file biner dan karenanya akan kehilangan banyak manfaat dari sesuatu seperti Git, misalnya kemampuan untuk memilih perubahan pada file tersebut.
Solusi untuk itu mungkin mengenkripsi pasangan nilai kunci atau mungkin hanya nilai. Anda dapat mengenkripsi semua nilai, misalnya jika Anda memiliki file terpisah untuk informasi sensitif, atau mengenkripsi hanya nilai-nilai sensitif jika Anda memiliki semua nilai dalam satu file. (Lihat di bawah)
Contoh saya di atas agak tidak berguna bagi siapa pun yang ingin melakukan tes dengannya, atau sebagai contoh untuk memulai karena mengasumsikan adanya beberapa kunci RSA dan file konfigurasi terenkripsi config.RSA
.
Jadi, inilah beberapa baris kode tambahan yang ditambahkan untuk membuat kunci RSA dan file konfigurasi untuk dimainkan.
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);
Mengenkripsi nilai saja
fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');
Anda dapat mendekripsi file konfigurasi dengan nilai terenkripsi menggunakan sesuatu seperti ini.
const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});
Dengan setiap item konfigurasi pada baris terpisah (mis. Hello
DanGoodbye
atas), Git akan mengenali lebih baik apa yang terjadi dalam file dan akan menyimpan perubahan pada item informasi sebagai perbedaan daripada file lengkap. Git juga akan dapat mengelola penggabungan dan pemilihan ceri dll dengan lebih baik.
Namun semakin Anda ingin mengubah kontrol perubahan pada informasi sensitif, semakin Anda bergerak menuju solusi SAFE REPOSITORY (2) dan menjauh dari solusi ENCRYPTED INFO (3).