根据您的具体问题,处理存储库中的密码的方式会有所不同。
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) 解决方案。