express-session在浏览器中存的connect.sid是加密过的

以下文章中涉及的算法可能已经更改,但是流程/原理是差不多的
https://cnodejs.org/topic/55c37de8b98f51142b367aba

若本次cookie中没有connect.sid,则生成一个 [用secret生成connect.sid]
  1. 用uid-safe生成一个唯一id,记为sessionid,保证每次不重复;
  2. 把上面的connect.sid制作成 's:' + sessionid + '.' + sessionid.sha256(secret).base64() 的形式,实现在node-cookie-signature的sign函数;
  3. 把sessionid用set-cookie返回给前端;
若本次cookie中包含connect.sid,则验证它是否是本服务器生成的 [用secret验证connect.sid]
  1. 取出cookie中的connect.sid,形式是上面的 's:' + sessionid + '.' + sessionid.sha256(secret).base64()
  2. 从connect.sid中截取出sessionid=connect.sid.slice(2, connect.sid.indexOf(’.’));
  3. 用取出的sessionid再算一次 sessionid.sha256(secret).base64() 记为 mac;
  4. 截取connect.sid中’.'后的部分与mac对比;node-cookie-signature的unsign函数(用上次计算的sha256值和这次计算的sha256值进行比较,只要secret一样,结果就一样);
  5. 验证成功的sessionid继续往下走。
总结

用secret进行签名保证存在cookie中的connect.sid是本服务器上次生成的。除非知道secret,不然没办法伪造connect.sid中的sessionid,避免知道了sessionid生成算法的人(uid-safe)使用sessionid随便试探来攻击网站。
解密,算了两次带secret的sha256哈希值,判断两次sha256哈希值是否相等就达到效果了,哈希值没有解密的过程。

你可能感兴趣的:(express-session在浏览器中存的connect.sid是加密过的)