passport.js deserializeUser 如何解密散列的会话数据?
Posted
技术标签:
【中文标题】passport.js deserializeUser 如何解密散列的会话数据?【英文标题】:How does passport.js deserializeUser decrypt the hashed session data? 【发布时间】:2019-11-08 18:20:01 【问题描述】:用户通过发送 POST 说 /login 登录后,passport 将附加一个会话 cookie,从而建立一个持久会话。这是通过 serializeUser 函数完成的。然后 express-session 将使用该函数生成一个哈希(使用 HMAC 计算)并发送过去。
在下一个请求中,passport 以某种方式设法使用 deserializeUser 函数解密散列字符串并从中检索用户数据。如果 express-session 真的对字符串进行哈希处理,这怎么可能?哈希不是单向函数吗?如果 express-session 不对字符串进行哈希处理,那这不是一个安全漏洞吗?
【问题讨论】:
【参考方案1】:由应用程序提供serializeUser
和deserializeUser
。
应用程序应该能够安全地执行deserializeUser
,因为他们可以检查他们收到的每个散列(护照中间件通过request.session
设置和读取;我认为感兴趣的责任部分可能是这些:https://github.com/expressjs/session/blob/master/index.js#L160和@ 987654322@(或在最近维护的分支上,https://github.com/passport-next/passport/blob/master/lib/sessionmanager.js#L21-L28))针对他们存储在自己的本地数据库/文件/服务中的地图,之前已将此类用户会话哈希与用户名(和/或其他特定的会话信息)。
该应用程序不需要将密码作为原始文本存储在服务器上,我认为这是主要问题,因为暴露的服务器不仅会向黑客泄露他们在该站点的数据,而且还会向黑客泄露经常在其他站点重复使用的用户密码.对用户名进行哈希处理对隐私保护更好一些,因为检查用户 cookie 以查找旧会话哈希的人甚至不知道他们是哪个用户。
中间件在请求对象上设置任何会话对象不应该存在安全问题,因为中间件的选择和顺序是在应用程序的控制之下,而不是通过网络传输的。
【讨论】:
以上是关于passport.js deserializeUser 如何解密散列的会话数据?的主要内容,如果未能解决你的问题,请参考以下文章
passportJS serializeUser 和 deserializeUser 从未调用过
如何在 passport-facebook / Passport.js 中捕获 FacebookAuthorizationError?