Node.js TCP套接字会话

Node.js TCP套接字会话,node.js,sockets,session,authentication,tcp,Node.js,Sockets,Session,Authentication,Tcp,我有多个客户端从应用程序连接到Node.js TCP套接字服务器。我想知道一种安全的方式来管理他们的会话 用户名+密码通过套接字传递给服务器。服务器确认这是正确的 我相信我现在需要生成一个唯一的令牌以发送回客户端 现在,如果用户关闭应用程序,然后再次打开它,该令牌可以传递给服务器,因此服务器将再次确认用户已通过身份验证 不过,其他人可能会使用此令牌访问此个人帐户。有没有办法防止这种情况 是否有一种更安全的方法,同时仍然保持用户无需再次登录即可进行身份验证的能力 您将如何使用相同的登录名处理来自其

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

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

我相信我现在需要生成一个唯一的令牌以发送回客户端

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

不过,其他人可能会使用此令牌访问此个人帐户。有没有办法防止这种情况

是否有一种更安全的方法,同时仍然保持用户无需再次登录即可进行身份验证的能力

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


非常感谢。

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

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

在cookies上设置secure属性以将cookie绑定到https,并避免通过http传输cookie

使用某种消息身份验证摘要,例如HMAC,以确保cookie未被篡改

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

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

希望这有助于


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

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

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

在cookies上设置secure属性以将cookie绑定到https,并避免通过http传输cookie

使用某种消息身份验证摘要,例如HMAC,以确保cookie未被篡改

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

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

希望这有助于


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

可能是这样的:

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


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

可能类似于:

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


这并不完美,因为您仍然可以在登录时拦截令牌,但是您还可以获得用户名和pwd。

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

当然,这只有在你的坏人不能和你的客户来自同一个IP地址时才有效。如果你担心那些与你的客户在同一NAT后面的坏人,因此看起来可能来自同一个IP,那么你将不得不提高你的安全性,也许会考虑一个类似于SSH使用的系统,但这有点复杂。 至于来自多个设备的连接,这取决于您-您可以跟踪某个令牌,然后 当用户从不同的IP登录时,同时允许两个IP使用相同的令牌访问站点时,将该令牌交回,或者您可以在每次有人进行身份验证时发出新的令牌。就个人而言,我倾向于发现发行新代币更容易,追踪和麻烦更少。。。但归根结底,这取决于您的应用程序以及您想要如何组织事情,我可以为这两种方法想出好的用例


另外,对于进行密码交换。。您至少应该在那里做一些散列,即服务器向客户端发送一些随机字符串,然后客户端使用一些散列函数(如md5或sha)计算hashrandom\u字符串+hashusername+密码并将其发送回。然后,服务器通过检查hashrandom_string+password_hash是否等于用户发送的内容来验证是否匹配。这使得用户的纯文本密码不必存储在任何地方-在服务器上,当密码更改时,您只需存储密码\u hash=hashusername+password。

这归结为您对足够安全的定义。您现在所做的,本质上是会话跟踪,对于许多通用用途来说,它通常是足够安全的-但是,通常会添加一个额外的组件,其中会话应该只对特定ip有效。如果用户的IP发生变化,您应该让他们再次登录并向他们颁发新的令牌。这样一来,如果有坏人劫持了他们的会话id,对他们没有任何好处

当然,这只有在你的坏人不能和你的客户来自同一个IP地址时才有效。如果你担心那些与你的客户在同一NAT后面的坏人,因此看起来可能来自同一个IP,那么你将不得不提高你的安全性,也许会考虑一个类似于SSH使用的系统,但这有点复杂。 至于来自多个设备的连接,这取决于您-您可以跟踪某个令牌,并在用户从不同的IP登录时将该令牌交回,同时允许两个IP使用相同的令牌访问站点,或者您可以在每次有人进行身份验证时发出新的令牌。就个人而言,我倾向于发现发行新代币更容易,追踪和麻烦更少。。。但归根结底,这取决于您的应用程序以及您想要如何组织事情,我可以为这两种方法想出好的用例


另外,对于进行密码交换。。您至少应该在那里做一些散列,即服务器向客户端发送一些随机字符串,然后客户端使用一些散列函数(如md5或sha)计算hashrandom\u字符串+hashusername+密码并将其发送回。然后,服务器通过检查hashrandom_string+password_hash是否等于用户发送的内容来验证是否匹配。这样,用户的纯文本密码就不必存储在任何地方——在服务器上,当密码更改时,您只需存储密码\u hash=hashusername+password。

查找人们使用TCP的真正原因。对50个人来说,这似乎是一个小小的一周。对不起,完全没有问题,正如我所说的,我跳过了TCP部分,在写这篇文章时考虑了http。所以没关系:-寻找人们使用TCP的真正原因。对50个人来说,这似乎是一个小小的一周。对不起,完全没有问题,正如我所说的,我跳过了TCP部分,在写这篇文章时考虑了http。所以没关系:-