会话的“秘密”选项是什么?


111

我对加密一无所知。我想知道会话秘密是什么。

我看到这样的代码:

app.use(express.session({
  store: mongoStore({
    url: app.set('db-uri')
  }),
  secret: 'topsecret'
}));

什么是秘密,我应该更改吗?

Answers:


83

是的,您应该更改它。连接中的会话秘密仅用于计算哈希。没有字符串,对会话的访问实质上将被“拒绝”。看一下connect docs,应该会有所帮助。


43
您不仅可以更改它,还应该更改它。
Michael Mior 2012年

1
@MichaelMior,多久一次?
FRD 2014年

9
@FRD我的意思是,您不应该保留诸如之类的默认值topsecret。密码应该是随机的字符串。理想情况下,如果已发现它,则还应定期更改它。但是,这需要支持秘密轮换,因此您不会立即使现有会话无效。也就是说,两个会话机密应同时视为有效。据我所知,Express目前不支持旋转秘密。
Michael Mior 2014年

7
自1.11.0起,@ MichaelMior express-session支持秘密轮换。来自文档:“如果提供了一个秘密数组,则仅第一个元素将用于对会话ID cookie进行签名,而在验证请求中的签名时将考虑所有元素。” (有关详细信息,请参见expressjs / session#127。)
Wolfgang,

这和签名的cookie是一样的东西吗,如果是的话,那么您是否需要这样做:res.cookie('name', 'value', {signed: true})
Muhammad Umer,

22

该秘密用于哈希与HMAC的会话:

https://github.com/senchalabs/connect/blob/master/lib/middleware/session.js#L256

然后通过使用秘密检查哈希值的指纹来保护会话免受会话劫持:

https://github.com/senchalabs/connect/blob/master/lib/middleware/session.js#L281-L287


3
哈希如何防止会话劫持?如果攻击者拥有会话cookie,那么他们也没有哈希吗?如果攻击者没有 cookie,那么秘密哈希如何使它变得更难以猜测(相对于拥有更长的随机会话ID)呢?
Stuart P. Bentley,

8
秘密是散列的盐,这只会使某人更难:1.解密钓鱼的cookie,2.冒充用户来欺骗会话,因为他们没有他们不能拥有的秘密(盐)产生适当的工作阶段编号。
mattdlockyer

7
由于这是3年的答案,因此这两个链接均无效。
trysis

5
@mattdlockyer这不能保护您免遭会话劫持。为何攻击者会尝试解密Cookie?如果攻击者拥有cookie,则他/她已经具有完全访问权限,直到会话结束。我的意思是,这并不像人们将用户密码存储在cookie中那样,这太可笑了。而且几乎应该避免使用jwt之类的东西。
Forivin

关于会话机密的目的似乎有不同的答案。有人说它可以防止会话劫持,而另一些人则不同意。有人可以解释生成此哈希的真正目的是什么?恰恰是,它计算哈希值是为了什么?
nawK

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.