Node.js TCP套接字会话

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

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

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

现在,如果用户closures应用程序,然后再打开它,这个令牌可以传递给服务器,因此服务器将确认用户再次被authentication。

但是,这个令牌可能被其他人用来访问这个人帐户。 有没有办法来防止这一点?

有没有更安全的方法(同时仍然保持用户无需再次login进行身份validation的能力)?

你将如何处理来自使用相同login的其他设备的连接。 他们是否得到不同的标记或相同的标记?

非常感谢。

这归结于您的安全定义。 你现在正在做什么,这本质上是会话跟踪,它通常足够安全,用于很多通用的用法 – 但是通常会增加一个额外的组件,其中一个会话只应该被认为对特定的ip有效。 如果用户的IP改变了,你应该让他们再次login,并给他们一个新的令牌。 这样,如果一个坏家伙劫持他们的会话ID它不会做任何好事。

当然,这只有当你的坏人不能来自你的客户端的IP地址时才有效。 如果您担心与您的客户端位于同一NAT后面的坏人,并且可能来自同一个IP,那么您将不得不提高安全性,也许可以考虑使用类似于SSH的系统使用,但这有点复杂。

对于来自多个设备的连接,取决于您 – 您可以跟踪某个单一的令牌,并在用户从不同的IPlogin时回传该令牌(同时允许两个IP访问该站点使用相同的标记),或者您可以每次进行身份validation时发出新的令牌。 就我个人而言,我倾向于发现更容易发行新的令牌,更不用说跟踪和麻烦了……但归结于您的应用程序以及您想要组织的东西,我可以为这两种方法设想出好的使用案例。


此外,至于做密码交换..你应该至less做一些哈希那里,即服务器发送客户端一些random_string ,然后客户端使用一些hash函数(如md5sha )计算hash(random_string + hash(username + password))并将其发回。 服务器然后通过检查hash(random_string + password_hash)来validation这个匹配是否等于用户发送它。 这使得用户的纯文本密码永远不需要存储在任何地方 – 在密码更改时,您只需存储password_hash = hash(username+password)的服务器上。

也许这样的事情:

 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 

您应该只允许一个随机string的尝试,如果可能的话,检查从原始loginIP。

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

这个问题基本上归结为会话劫持使用被盗的cookies。 所以问题是如何尽可能保证cookie的安全。

  1. 使用https而不是http 并强制用户使用https 。 通过这种方式,cookie不会以明文forms传输,并且不会被窃听窃取。

  2. 在Cookie上设置secure属性(请参阅Wikipedia )将cookie绑定到https,并避免通过http传输。

  3. 使用某种types的消息authentication摘要(如HMAC)来确保cookie未被篡改。

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

  5. 最后但并非最不重要的一个令牌只能在给定的时间点使用一次。 如果用户在第二台机器上使用相同的令牌login,则禁止连接或结束第一台机器的会话。

希望这可以帮助 …

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