express-session 秘密应该是静态的还是动态的?
Posted
技术标签:
【中文标题】express-session 秘密应该是静态的还是动态的?【英文标题】:express-session should secret be static or dynamic? 【发布时间】:2018-09-27 01:28:50 【问题描述】:我无法从文档中找到任何信息,即秘密应该是静态字符串还是应该/可以是动态的。这是我现在设置秘密的方式。
var salt1 = bcrypt.genSaltSync();
var salt2 = bcrypt.genSaltSync();
var secret = bcrypt.hashSync(salt1 + salt2, 10);
app.use(session(
// activeDuration: toTime("days", 7),
// duration: toTime("days", 7),
maxAge: toTime("days", 7),
saveUninitialized: false,
secret, // set this to a long random string!,
));
那么秘密应该是一次性的还是可以是动态的?
【问题讨论】:
【参考方案1】:通常,这些秘密用于签署和/或加密存储在客户端 cookie 中的会话数据(如果是 express,则用于签署会话数据以防止篡改)。
所以秘密一定是:
秘密(呃!) 静态(更改它将使使用旧密钥的任何会话无效,除非您也保留旧密钥) 可配置,就像数据库凭据等一样(您不想将秘密提交到您的代码库) 随机(任何给你一个长的随机/不可预测的字符串都可以)仅供参考,使用 bcrypt 生成它没有任何意义。 bcrypt 的目标是缓慢地防止暴力破解哈希。这与这里无关。适当的随机性就足够了。
来自the docs的相关部分:
这是用于签署会话 ID cookie 的密钥。这可以是单个密钥的字符串,也可以是多个密钥的数组。
如果提供了一个秘密数组,则只有第一个元素将用于对会话 ID cookie 进行签名,而在验证请求中的签名时将考虑所有元素。
由于 express-session 支持保留旧的秘密,您可以轮换活动的秘密。例如,您可以每月一次为阵列添加一个新的随机密钥,从而允许使用旧密钥的现有会话继续工作,而不会将其用于任何新会话。然后,一旦达到您的最大年龄,您就可以安全地删除这么多天未使用的秘密。像这样,会话秘密的意外泄漏会在一段时间后变得无害(当然,除非有人在此期间滥用它)
【讨论】:
【参考方案2】:难以猜测(但这应该不是问题) 在服务器重新启动时自动使所有会话无效(如果您使用本地缓存可能会很有用)动态
会话永远保持可读性 无需同步密钥即可使用多个服务器静态
【讨论】:
以上是关于express-session 秘密应该是静态的还是动态的?的主要内容,如果未能解决你的问题,请参考以下文章
什么时候应该将 cookie-parser 与 express-session 一起使用?