2012-12-31 252 views
1

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

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

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

现在,如果用户关闭应用程序,然后打开它再次,这种标记可以传递给服务器,因此服务器将确认用户再次发起认证。

潜在不过,此令牌可以由别人来访问该个人帐户。有没有办法来防止这种情况?

有没有更安全的方式(同时仍保持对用户无需再次登录认证的能力)?

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

非常感谢。

回答

4

这归结于您的安全定义。你现在正在做什么,这本质上是会话跟踪,它通常足够安全,可用于很多通用目的 - 但是通常会增加一个额外的组件,其中一个会话只应该被认为对特定的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)的服务器上。

+0

明智的答案,并感谢您增加了额外的细节。 –

0

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

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

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

  3. 使用某种消息认证的消化,如HMAC,以确保该Cookie未被篡改。

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

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

希望这有助于...

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

+0

真正在寻找人们使用TCP的方式。这似乎是50周的一个星期。对不起。 –

+0

绝对没有问题,正如所说的,我跳过了TCP部分(并且在我写这个时考虑了http)。所以不要紧张:-) –

1

也许是这样的:

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。

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