我正在使用node.js + express测试Google OAuth2.0并使用快速会话管理会话,我发现我的会话管理器需要密钥。
所以我做了一些研究,找到a post,这有一些很好的建议。但它似乎需要一些解决方法,例如将密钥设置为环境变量或将其保存在配置文件中。
所以我决定生成随机字符串并将其存储在主机文件系统中。它似乎解决了我上面介绍的所有问题,但我不喜欢web开发,所以我不是确定这是否合法。
这种方法是否有任何缺点或利用?
以下是我的sessionSecret.js
文件:
var crypto = require('crypto');
var fs = require('fs');
var filePath = '/home/ubuntu/results.txt';
function readSecretKey() {
return new Promise(function(resolve, reject) {
fs.readFile(filePath, 'utf8', function(err, key) {
if (err) {
reject(err);
} else {
resolve(key);
}
});
});
}
function writeSecretKey(key) {
return new Promise(function(resolve, reject) {
fs.writeFile(filePath, key, function(err) {
if (err) {
reject(err);
} else {
resolve(key);
}
});
});
}
function generateRandomString() {
return new Promise(function(resolve, reject) {
crypto.randomBytes(48, function(err, buf) {
if (err) {
reject(err);
} else {
resolve(buf.toString('hex'));
}
})
});
}
module.exports.getOrCreate = function() {
return new Promise(function(resolve, reject) {
readSecretKey()
.then(function(key) {
console.log("Key exists: " + key);
resolve(key);
}, function() {
console.log("Key does not exists. Generating...");
return generateRandomString();
})
.then(function(key) {
if (key) {
console.log("Key generated: " + key);
return writeSecretKey(key);
}
}).then(function(key) {
if (key) {
resolve(key);
}
}, function(err) {
reject(err);
});
});
};
答案 0 :(得分:3)
你的直觉是正确的。
将秘密作为环境变量传递只是将问题移出应用程序。无论如何你必须把它们放在某个地方。
将它们作为参数传递不如文件安全,因为服务器上的任何用户都可以ps aux
并查看它们。
在我看来,你唯一做错的事就是过度复杂化了。我建议从sessionSecret.js
删除大部分代码,而不是动态生成它,只需从配置文件中获取它。如果配置文件不存在,请关闭应用程序。
不要将密钥存储在repository / SCM中 我将我的秘密放在服务器的/ etc /中的特殊文件夹中。如果有人能够访问,那么窃取会话是他们能做的最少的事情。
答案 1 :(得分:1)
将会话存储在环境变量中被认为是最佳做法。