【发布时间】:2011-03-15 11:47:42
【问题描述】:
为了提高性能,我想尝试消除一个普通的“会话 cookie”,但加密 cookie 本身中的所有信息。
一个非常简单的例子:
userid= 12345
time=now()
signature = hmac('SHA1',userid + ":" + time, secret);
cookie = userid + ':' + time + ':' + signature;
该时间将用于最长到期时间,因此 cookie 不会永远存在。
现在有个大问题:这是个坏主意吗?
我最好改用 AES256 吗?就我而言,数据不是机密的,但在任何情况下都不得更改。
编辑
经过一些很好的评论和cmets,我想补充一下:
- “秘密”对于每个用户都是唯一的且不可预测(随机字符串 + 用户 ID?)
- cookie 将自动过期(这是根据时间值 + 一定的秒数完成的)。
- 如果用户更改密码(或者甚至注销?)密码应该会更改。
最后一点:我正在尝试提出减少数据库负载的解决方案。这只是我正在研究的解决方案之一,但它是我最喜欢的。主要原因是我不必研究更适合这种数据的其他存储机制(memcache、nosql),它使 Web 应用程序更加“无状态”。
10 年后编辑
JWT 现在是一件事。
【问题讨论】:
-
嗨,米粉饼干,它是 PHP,但为了避免针对特定平台的讨论,我将其省略了。目前我们在多个网络服务器上使用 PHP,以及 Master-Master mysql 设置。会话 cookie 缓存在 memcached 中。我们的瓶颈主要是添加和删除 cookie。复制还需要转到辅助数据中心,与会话相关的查询占流量的很大一部分。
-
“秘密”对于每个用户来说都是唯一的且不可预测(随机字符串 + 用户 ID ?)
-
同样的事情@如果用户更改了他们的密码,(或者甚至可能注销?)秘密应该改变。
-
这是一个老问题,但这种使用签名 cookie 的方法现在已成为主流。 python 框架 Flask 将其用于其会话 (flask.pocoo.org/docs/dev/api/#sessions)。尽管单个密钥通常在应用程序范围内使用,而不是每个用户的密钥。
-
@cake 也是这么想的,他还是存储了状态。