生成会话秘密(或任何其他秘密密钥)并将其存储在主机服务器中是否可以?
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,其中有一些不错的建议。但它似乎需要一些解决方法,比如将密钥设置为环境变量或将其保存在配置文件中。
- 使用前者,每次重新部署服务器都需要输入环境变量
- 使用后者会将我的密钥暴露给 SCM。
所以我决定生成随机字符串并将其存储在主机文件系统中。 似乎解决了我上面介绍的所有问题,但我是网络开发的菜鸟所以我不确定这是否合法。
这种方法有什么缺点或利用吗?
下面是我的 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/ 中的一个特殊文件夹中。如果有人可以访问它,窃取会话是他们至少可以做的。
将会话存储在环境变量中被认为是最佳做法。
我在 node.js + express 上测试 Google OAuth2.0 并使用 express-session 管理会话,我发现我需要 Secret Key 我的会话管理器。
所以我做了一些研究,发现 a post,其中有一些不错的建议。但它似乎需要一些解决方法,比如将密钥设置为环境变量或将其保存在配置文件中。
- 使用前者,每次重新部署服务器都需要输入环境变量
- 使用后者会将我的密钥暴露给 SCM。
所以我决定生成随机字符串并将其存储在主机文件系统中。 似乎解决了我上面介绍的所有问题,但我是网络开发的菜鸟所以我不确定这是否合法。
这种方法有什么缺点或利用吗?
下面是我的 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/ 中的一个特殊文件夹中。如果有人可以访问它,窃取会话是他们至少可以做的。
将会话存储在环境变量中被认为是最佳做法。