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

问题描述

哪个更安全更快?会话 id 的 uuid4 或 crypto.randomBytes ?

这就是我目前生成会话 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() 代码中看到的一些小问题。