生成随机会话ID用于cookie的最安全方法是什么?

6 投票
8 回答
15431 浏览
提问于 2025-04-15 21:00

我正在写一个自己的会话控制器,当用户登录时,会给他们发一个独特的ID,然后在每次加载页面时验证和确认这个独特的ID。请问,生成这个ID的最安全方法是什么?这个独特的ID应该完全随机吗?把用户ID作为这个独特ID的一部分有什么坏处吗?

8 个回答

4

在Python 2.5及以上版本中,可以使用UUID模块。这样生成的值是随机的,不容易被猜到,因为它们不是按顺序排列的。如果你想让这些值更加安全,可以把用户的ID加盐,然后用SHA1算法进行哈希处理,再用Base64编码这个结果,最后把它作为值使用。这样一来,你就可以在服务器端验证这些值确实是你的cookie,而不是某个垃圾邮件发送者随便生成并发送到你服务器的东西。为了让它们更安全,还要确保这些值在服务器和客户端都有一个固定的有效时间。Python 2.6.5内置了HMAC的实现,你也可以用它来处理生成的UUID。

8

去买布鲁斯·施奈尔的《秘密与谎言》和《实用密码学》。顺便也可以订购罗斯·安德森的《安全工程(第二版)》。现在,先读《秘密与谎言》——相信我,这本书很有趣。:) 然后再读《实用密码学》。到这个时候,你应该对在需要安全的情况下如何实现软件有了更好的理解。接下来,动手做一个初步的实现。等《安全工程》这本书到了,慢慢读吧……这本书内容比较多,需要花时间消化。

还有一份关于网络认证的白皮书,值得一读,跟你正在做的事情更直接相关。我还是推荐上面提到的那些书。

另外,LWN.net上的一篇及时文章列出了很多你需要避免的陷阱。(顺便说一下,LWN.net非常值得订阅,我强烈推荐。上面的链接可以让你免费访问这篇文章,非订阅者是无法看到的。)

4

如果你在cookie里只放了一个标识符,基本上就是个标签,那么你需要防范的攻击就是有人猜这个标签是什么。所以,使用一些随机的字节。要足够随机,这样就“无法被猜测”。

然后把这些随机字节压缩成可以放进HTTP cookie里的字符。使用base64就可以做到这一点。虽然这不是最完美的选择,因为cookie安全的字符有超过64个,而且它可能会留下结尾的==字符,这些字符会增加头部的字节数,但不会增加随机性,不过这没关系。它能工作,而且Python可能比我们想到的其他方法更快地进行base64编码。

如果你还想在前面加上用户ID,这样会让追踪和调试变得更简单,可能会让你的工作更轻松,所以可以这样做。这并不会给攻击者带来什么显著的优势。(除非他们能偷到一个cookie,但又无法确定是哪个用户的,这种情况似乎不太可能。)

撰写回答