在 node.js 中使用什么来生成会话 ID 更安全、更快速?

What is safer and faster to use for session ID generation in node.js?

哪个更安全更快? uuid4 或 crypto.randomBytes 用于会话 ID ?

这就是我目前生成会话 ID 的方式:

app.use(session({
 secret: 'some long secret',
 genid: ()=>{
   return crypto.randomBytes(32).toString('hex');
 },
 cookie: {
  ...
 }
}));

但我担心它会阻塞事件循环。哪个更好用? uuid4 还是 crypto.randomBytes ?性能、安全性和速度对我来说很重要。提前致谢。

因此,uuid4 仅使用 crypto.randomBytes() 本身:

function uuid4() {
  var rnd = crypto.randomBytes(16);
  rnd[6] = (rnd[6] & 0x0f) | 0x40;
  rnd[8] = (rnd[8] & 0x3f) | 0x80;
  rnd = rnd.toString("hex").match(/(.{8})(.{4})(.{4})(.{4})(.{12})/);
  rnd.shift();
  return rnd.join("-");
}

但是,它只生成一个 16 字节长的初始值,然后对其进行修改。如果你真的想知道两者的性能,就像所有与性能相关的问题一样,你将不得不分别进行基准测试和比较,但如果你让它们的长度相同,那么你不太可能发现很大的差异。


两者都应该可以正常工作。由于使用了 crypto.randomBytes() 的同步版本,两者都将对事件循环征收少量税款,但在正确使用会话时,这应该只在用户首次到达您的网站时触发,而没有现有的会话 cookie,因此它不是对每个请求的经常性税收。

从会话可猜测性的角度来看,两者都应该非常安全。在安全性方面,我倾向于使用广泛使用和广泛审查的库,而不是推出我自己的解决方案,因为我认为对安全性了解远比我多的人一直在寻找广泛使用的解决方案。

这是一篇关于 uuid4()descriptive post,其中包含一些关于碰撞可能性极低的评论。它还解释了您在 uuid4() 代码中看到的那些乱七八糟的东西是干什么用的。