在Node.js中如何生成会话ID?

17
我希望能够在低级别上使用会话。如何在node.js中生成会话ID?
1个回答

33

不清楚您想要实现什么,但是会话ID只是一个ID!您可以以任何方式生成它。除了唯一性之外,没有任何要求。不过,将其设置为安全的是个好主意。例如,这个函数可以成为您的会话ID生成器:

var crypto = require('crypto');

var generate_key = function() {
    // 16 bytes is likely to be more than enough,
    // but you may tweak it to your needs
    return crypto.randomBytes(16).toString('base64');
};

您调用generate_key()并检查它是否存在于数据库中。如果存在,您会再次调用它,以此类推。

编辑:让我回应一下评论:

  1. 最初我在这里使用了Math.random(),有人担心它不具有加密安全性。虽然这是真的,但我没有看到OP要求加密安全的解决方案。我们不知道他在处理什么类型的会话,毕竟。最终,我决定进行更改,因为加密解决方案更安全,并且(大多数情况下)没有任何缺点。
  2. Uuid是可接受的替代方案。我个人更喜欢uuid4,因为它不泄露信息,但其实并不重要。
  3. 生成任何类型的id所需的计算量不太可能很重要,并且大部分时间都会被数据库通信所主导(如果有)。除非您处理pbkdf2之类的算法。那样做我不会使用。但如果您这样做,您可能有自己的理由。

你认为使用加密函数生成会话ID是一个好的选择吗?加密需要大量的计算时间。我建议使用uuid函数,通过提供一些种子数据(如MAC地址)来解决分布式环境中的冲突问题。 http://blog.tompawlak.org/generate-unique-identifier-nodejs-javascript - Ashish
9
很不幸,唯一性以外还有其他要求,如不可预测性和足够的随机性。您应该使用 Node.js 的加密模块。Math.random是从当前时间开始种子化,因此它是可预测的,攻击者可以使用它来预测用户的会话 ID。 - SilverlightFox
1
这个会话 ID 不安全,因此我在顶部添加了一个注释,以便人们不会简单地复制和粘贴这个示例。 - laurent
2
UUID也不是一个可接受的会话ID,除非底层库使用足够随机的源。但这并不总是情况。 - Evert
1
我同意random库(我之前也没听说过)并不是一个好主意。但是,你的回答中也存在很多观点、错误建议和情感,这同样是有害的。 - Evert
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接