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 一起使用?

express-session 和 cookie-session 有啥区别?

模式的秘密-代理模式-静态代理

在谷歌地图中隐藏纬度和经度

express-session整理

如何使用@types/express-session?