การจัดการกับรหัสผ่านในที่เก็บข้อมูลจะได้รับการจัดการด้วยวิธีที่แตกต่างกันไปขึ้นอยู่กับปัญหาที่แท้จริงของคุณ
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 ที่เข้ารหัส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 จะสามารถจัดการการผสานและการหยิบเชอร์รี่ได้ดีขึ้น
อย่างไรก็ตามยิ่งคุณต้องการควบคุมการเปลี่ยนแปลงข้อมูลที่ละเอียดอ่อนมากเท่าไหร่ยิ่งคุณย้ายไปยังโซลูชัน SAFE REPOSITORY (2) และอยู่ห่างจากโซลูชันเข้ารหัสข้อมูล (3)