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

Is it OK to generate session secret(or any other secret keys) and store it in host server?

我在 node.js + express 上测试 Google OAuth2.0 并使用 express-session 管理会话,我发现我需要 Secret Key 我的会话管理器。

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

所以我决定生成随机字符串并将其存储在主机文件系统中。 似乎解决了我上面介绍的所有问题,但我是网络开发的菜鸟所以我不确定这是否合法。

这种方法有什么缺点或利用吗?

下面是我的 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);
            });
    });
};

你的直觉是正确的。

将机密作为环境变量传入只是将问题转移到应用程序之外。无论如何,你必须把它们放在某个地方。

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

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

不要将秘密存储在 repository/SCM 我将我的秘密放在服务器的 /etc/ 中的一个特殊文件夹中。如果有人可以访问它,窃取会话是他们至少可以做的。

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

12factor.net/config