【问题标题】:Node.js TCP socket sessionsNode.js TCP 套接字会话
【发布时间】:2012-12-15 21:21:57
【问题描述】:

我有多个客户端从应用程序连接到 Node.js TCP 套接字服务器。我想知道一种管理他们会话的安全方式。

用户名 + 密码通过套接字传递到服务器。服务器确认这是正确的。

我认为我现在需要生成一个唯一令牌以发送回客户端。

现在,如果用户关闭应用程序,然后再次打开,此令牌可以传递给服务器,因此服务器将再次确认用户已通过身份验证。

不过,此令牌可能会被其他人用来访问此人的帐户。有没有办法防止这种情况发生?

是否有更安全的方式(同时仍保持用户无需再次登录即可进行身份验证的能力)?

您将如何使用同一登录名处理来自其他设备的连接。他们得到不同的令牌还是相同的令牌?

非常感谢。

【问题讨论】:

    标签: node.js sockets session authentication tcp


    【解决方案1】:

    这取决于您对足够安全的定义。您现在正在做的事情,本质上是会话跟踪,并且对于许多通用用途来说通常足够安全 - 但是通常会添加一个额外的组件,其中会话应该只被视为对特定 IP 有效。如果用户的 IP 发生变化,你应该让他们重新登录并给他们一个新的令牌。这样一来,如果一些坏人劫持了他们的会话 ID,这对他们没有任何好处。

    当然,这仅在您的坏人无法与您的客户来自同一 IP 地址时才有效。如果您担心与您的客户端位于同一 NAT 后面的坏人,因此可能看起来来自同一 IP,那么您将不得不进一步提高安全性,并且可能考虑使用类似于 SSH 的系统使用,但这有点复杂。

    至于来自多个设备的连接,这取决于您 - 您可以跟踪某个单一令牌并在用户从不同 IP 登录时交回该令牌(同时现在允许两个 IP使用相同的令牌访问该站点),或者您可以在每次有人进行身份验证时发出一个新的令牌。就我个人而言,我倾向于发现发行新令牌更容易,更少跟踪和麻烦......但这取决于您的应用程序以及您希望如何组织事物,我可以为这两种方法设计好的用例。


    另外,至于做密码交换。你至少应该在那里做一些散列,即服务器向客户端发送一些random_string,然后客户端使用一些hash函数(例如md5sha ) 计算hash(random_string + hash(username + password)) 并将其发回。然后服务器通过检查hash(random_string + password_hash) 来验证这个匹配是否等于用户发送的任何内容。这使得用户的纯文本密码永远不必存储在任何地方 - 在密码更改时您只需存储 password_hash = hash(username+password) 的服务器上。

    【讨论】:

      【解决方案2】:

      可能是这样的:

      FIRST LOGIN:
      username + pwd (hashed)       ---> check user/hashed pwd
      receive token                 <--- send token 
      
      NEXT LOGIN:
      request login                 ---> receive request 
      receive random string         <--- send random string
      hash string with token as salt ---> compare hashed string
      

      您应该只允许使用该随机字符串进行一次尝试,如果可能,请检查原始登录的 IP。

      这并不完美,因为您仍然可以在登录时拦截令牌,但您也将拥有用户名和密码。

      【讨论】:

        【解决方案3】:

        这个问题基本上归结为使用偷来的 cookie 进行会话劫持。所以问题是如何尽可能地保护 cookie。

        1. 使用 https 而不是 http 并强制您的用户使用 https。这样,cookie 就不会以明文形式传输,也不会被窃听。

        2. 在cookies上设置secure属性(见Wikipedia),将cookie绑定到https,避免通过http传输。

        3. 使用某种消息身份验证摘要(例如 HMAC)来确保 cookie 未被篡改。

        4. 您可以选择将客户端的 IP 地址嵌入到 cookie 中,并且仅在从特定 IP 发送时才接受它。不幸的是,这可能会导致代理服务器或不时重新分配 IP 地址的拨号连接出现问题。

        5. 最后但同样重要的是,允许一个令牌在给定时间点仅使用一次。如果用户在第二台机器上使用相同的令牌登录,则要么禁止连接,要么结束第一台机器的会话。

        希望这会有所帮助...

        PS:非常抱歉,我跳过了 TCP 部分。当然我写的大部分内容只适用于http,而不适用于TCP。无论如何,有些事情可能会有所帮助,例如 #3、#4 和 #5。

        【讨论】:

        • 真正寻找人们对 TCP 的使用。对于 50 人来说,这似乎是一个短暂的一周。抱歉。
        • 绝对没问题,如前所述,我跳过了 TCP 部分(我在写这篇文章时正在考虑 http)。所以没关系:-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 2015-05-18
        • 1970-01-01
        • 2014-11-08
        • 2015-05-20
        • 1970-01-01
        • 2011-09-17
        相关资源
        最近更新 更多