Xử lý mật khẩu trong kho sẽ được xử lý theo nhiều cách khác nhau tùy thuộc vào vấn đề chính xác của bạn là gì.
1. Đừng làm điều đó.
Và các cách để tránh làm được đề cập trong một số câu trả lời - .gitignore, config.example, v.v.
hoặc 2. Làm cho kho lưu trữ chỉ có thể truy cập đối với người được ủy quyền
Tức là những người được phép biết mật khẩu. chmod
và các nhóm người dùng đến với tâm trí; còn các vấn đề như nhân viên Github hoặc AWS có được phép xem mọi thứ nếu bạn lưu trữ bên ngoài kho hoặc máy chủ của mình không?
hoặc 3. Mã hóa dữ liệu nhạy cảm (mục đích của phản hồi này)
Nếu bạn muốn lưu trữ các tệp cấu hình của mình có chứa thông tin nhạy cảm (như mật khẩu) ở một vị trí công cộng thì nó cần phải được mã hóa. Các tập tin có thể được giải mã khi được phục hồi từ kho lưu trữ, hoặc thậm chí được sử dụng trực tiếp từ dạng được mã hóa của chúng.
Một ví dụ giải pháp javascript để sử dụng dữ liệu cấu hình được mã hóa được hiển thị bên dưới.
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);
Vì vậy, bạn có thể khôi phục tệp cấu hình được mã hóa chỉ bằng một vài dòng Javascript.
Lưu ý rằng việc đặt một tệp config.RSA
vào kho lưu trữ git sẽ khiến nó trở thành một tệp nhị phân một cách hiệu quả và do đó nó sẽ mất nhiều lợi ích của một cái gì đó như Git, ví dụ như khả năng chọn cherry thay đổi cho nó.
Giải pháp cho vấn đề đó có thể là mã hóa các cặp giá trị khóa hoặc có lẽ chỉ là các giá trị. Bạn có thể mã hóa tất cả các giá trị, ví dụ nếu bạn có một tệp riêng cho thông tin nhạy cảm hoặc chỉ mã hóa các giá trị nhạy cảm nếu bạn có tất cả các giá trị trong một tệp. (xem bên dưới)
Ví dụ của tôi ở trên là một chút vô dụng đối với bất kỳ ai muốn thực hiện thử nghiệm với nó hoặc làm ví dụ để bắt đầu vì nó giả sử sự tồn tại của một số khóa RSA và tệp cấu hình được mã hóa config.RSA
.
Vì vậy, đây là một số dòng mã bổ sung được thêm vào để tạo khóa RSA và tệp cấu hình để chơi.
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);
Chỉ mã hóa giá trị
fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');
Bạn có thể giải mã một tập tin cấu hình với các giá trị được mã hóa bằng cách sử dụng cái gì đó như thế này.
const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});
Với mỗi mục cấu hình trên một dòng riêng biệt (ví dụ Hello
và Goodbye
ở trên), Git sẽ nhận ra tốt hơn những gì đang diễn ra trong một tệp và sẽ lưu trữ các thay đổi đối với các mục thông tin là khác biệt thay vì các tệp hoàn chỉnh. Git cũng sẽ có thể quản lý sáp nhập và chọn cherry tốt hơn.
Tuy nhiên, bạn càng muốn kiểm soát phiên bản thay đổi thành thông tin nhạy cảm, bạn càng hướng tới giải pháp SAFE REPOSITORY (2) và tránh xa giải pháp ENCRYPTED INFO (3).