快递会秘密是静态的还是动态的?

时间:2018-04-17 07:16:14

标签: javascript node.js express session session-cookies

我无法从文档中找到任何信息,无论秘密应该是静态字符串还是应该/可以是动态的。这就是我现在如何设置秘密的方法。

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!,
}));

那么秘密应该是一次性的还是动态的?

2 个答案:

答案 0 :(得分:5)

通常这些秘密用于签署和/或加密存储在客户端cookie中的会话数据(如果表达它用于签署会话数据以防止篡改)。

所以秘密必须是:

  • 秘密(呃!)
  • 静态(更改它将使用旧密码使任何会话无效,除非您保留旧密码)
  • 可配置,就像数据库凭据等(您不想向代码库提交秘密)
  • 随机(任何给你一个长随机/不可预测字符串的东西都没问题)

仅供参考,使用bcrypt生成它是没有意义的。 bcrypt的目标是缓慢防止暴力破坏哈希。这与此无关。适当的随机性就足够了。

the docs的相关部分:

  

这是用于签署会话ID cookie的秘密。这可以是单个秘密的字符串,也可以是多个秘密的数组。

     

如果提供了一系列秘密,则只会使用第一个元素对会话ID cookie进行签名,而在验证请求中的签名时将考虑所有元素。

由于快速会话支持保留旧秘密,因此您可以轮换活动密钥。例如,每月一次,您可以在阵列中添加一个新的随机密钥,从而允许具有旧秘密的现有会话继续工作,而不会将其用于任何新会话。然后,一旦达到最大年龄,您就可以安全地删除多天未使用的秘密。像这样,会话秘密的意外泄漏会在一段时间后变得无害(除非有人在此期间滥用它)

答案 1 :(得分:3)

  

动态

  • 难以猜测(但这不应该是一个问题)
  • 服务器重新启动时自动使所有会话无效(如果使用本地缓存,则可能很有用)
  

静态

  • 会话永远可读
  • 无需同步密钥即可使用多台服务器