在Node-express应用程序中存储机密的最佳位置是什么。
以前,我曾经将其存储在.env文件中,并使用npm dotenv扩展名并通过执行类似这样的操作来传递它
process.env.MYSECRET
但是看来这不是正确的方法。为什么?一次
Firebase CLI当前不允许您设置流程环境 变量o
我遇到的另一种方法是创建一个包含我们所有API密钥的配置文件,并将其放在gitignore中,但我不想一遍又一遍地从我的配置文件夹中导入它。
很困惑,想在这里问
答案 0 :(得分:0)
将机密信息存储在环境变量中并不安全,因为像my-db-pw
这样的简单命令会显示所有环境变量及其值。另外,任何日志转储都可能包含该文件,但这不是那么安全。
一个更好的选择是将密钥存储在配置文件中,例如componentDidMount() {
const dayNumber = parseInt(this.props.match.params.number);
jQuery.ajax('http://localhost:9018/api/day/' + dayNumber)
.done((result) => {
this.setState({
day: result, status: 'SUCCESS',
});
})
.fail(() => {
this.setState({ status: 'ERROR' })
});
}
(愚蠢的示例),并在引导应用程序时从密钥值存储中读取值。如果您正在使用AWS(就像我们一样),则使用AWS Secrets Manager。无论如何,您的密码最终都会存储在RAM中,这比env变量安全一些。而且,您不需要每次都需要密码时调用秘密存储:只需在应用加载时调用一次即可,这可以满足大多数需求。如果密码失败,那么您可以编写代码以重新检索它们。
话虽如此,一种更好的方法是对它们进行哈希处理。但是,这似乎有点不合时宜,但是here's是一个很好的起点,并且此来源here对此进行了扩展。基本上,哈希是一种单向算法。假设您的密码是“ 123”,并且哈希变成“ sadcdsc-324”。然后,当例程(程序)比较两个密码时,它还将在内部散列“ 123”并得到相同的“ sadcdsc-324”,这就是要进行比较的内容。抱歉,这不是主题,但我想提一下也是为了彻底。
最后,有加密功能,但是对于您所描述的情况,这通常是过分的。
总而言之,似乎本地文件配置足以满足您的需求,因为RAM仍然比env变量更安全。如果需要更高的安全性,可以如上所述添加哈希。
答案 1 :(得分:0)
服务器密钥只能访问API密钥之类的秘密,如果保存到文件中,则使用.gitignore
规则排除在源代码之外。
firebase config:set
存储Firebase项目API密钥。 示例:
$ firebase functions:config:set myapp.apikey=https://hooks.slack.com/services/XXX
然后从本地仿真器或已部署的代码中使用:
const functions = require('firebase-functions');
const apikey = functions.config().myapp.apikey;