是否可以生成会话密钥(或任何其他密钥)并将其存储在主机服务器中?

时间:2016-03-13 06:26:59

标签: node.js session secret-key

我正在使用node.js + express测试Google OAuth2.0并使用快速会话管理会话,我发现我的会话管理器需要密钥

所以我做了一些研究,找到a post,这有一些很好的建议。但它似乎需要一些解决方法,例如将密钥设置为环境变量或将其保存在配置文件中。

  • 使用前者,每次重新部署服务器时都需要输入环境变量。
  • 使用后者将我的密钥暴露给SCM。

所以我决定生成随机字符串并将其存储在主机文件系统中。它似乎解决了我上面介绍的所有问题,但我不喜欢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);
            });
    });
};

2 个答案:

答案 0 :(得分:3)

你的直觉是正确的。

将秘密作为环境变量传递只是将问题移出应用程序。无论如何你必须把它们放在某个地方。

将它们作为参数传递不如文件安全,因为服务器上的任何用户都可以ps aux并查看它们。

在我看来,你唯一做错的事就是过度复杂化了。我建议从sessionSecret.js删除大部分代码,而不是动态生成它,只需从配置文件中获取它。如果配置文件不存在,请关闭应用程序。

不要将密钥存储在repository / SCM中 我将我的秘密放在服务器的/ etc /中的特殊文件夹中。如果有人能够访问,那么窃取会话是他们能做的最少的事情。

答案 1 :(得分:1)

将会话存储在环境变量中被认为是最佳做法。

请参阅12factor.net/config