2010-02-02 122 views
1

我有一个网站(其基本要点描述在this question),我想有一些方法可以在用户使用网站(即上传和下载数据)时一直存储用户名和用户信息。我应该如何管理用户名/密码会话信息?

现在,如果登录成功,我将返回密码的散列以及任何相关信息。任何时候用户尝试一些东西,他们的用户名,散列等都必须与数据库中的内容相匹配。如果用户注销,他们的本地Sinatra会话将刷新所有信息。

我意识到这是一种非常幼稚的做法。有没有更好的方法来处理用户会话信息?关于cookie的维基百科条目提到使用会话uid而不是其他信息;这种方法的优点是什么?我怀疑这种方法也容易受到其他攻击的影响,但是由于我对所做的所有事情都进行了验证,所以我不确定自己打开的是什么样的攻击。另外,如果/当我执行ssl时,这些事务是否会'自动'加密,还是我需要做其他事情来确保字符串受到保护,如果它们需要的话?

回答

4

这实际上是一个非常复杂的问题。只是为了说明,您存在帐户锁定问题:如果基于失败的尝试锁定,攻击者对您的网站的DOS有多容易?

我将列出一些最佳实践,让您开始:

  1. 存储密码咸鱼和散列旁边的用户名和用户ID。 (你也应该存储旁边散盐。)

  2. 不允许频繁错误密码尝试。 (每几秒更频繁一次)。

  3. 如果尝试失败的任何给定的用户或任何给定的IP地址(一个微小的3倍以上)需要某种形式的人类验证的,像一个CAPTCHA。这可以让您防止总DOS攻击。

  4. 如果实施自动登录系统,使用令牌认证系统。

  5. 对于令牌认证系统,使用安全随机数生成器,发送平原令牌的用户,但盐和散列在数据库中的令牌

  6. 如果可能,请使用TLS/SSL,但一旦数据无线传输,不要依赖其安全性。

+0

什么是一个好的起始盐值?例如,我应该让我的数据库从当前系统时间生成一个随机数,然后密码密码哈希值,然后将其作为会话哈希值返回?下次用户登录时,盐是不同的,所以哈希是不同的,但它是持久的特定登录? – mmr 2010-02-02 04:14:34

+0

使用安全的随机数生成器,如.NET中的'RNGCryptoServiceProvider'。您可以安全地将salt存储在数据库中,其中alnong位于known-hash。 – 2010-02-02 04:16:21

0

如果你的网站是在asp.net中建立的,那么你可以使用点网络证券..这是非常好的。你也可以使用原理类来使它更安全..

+0

我使用的是Sinatra和ruby,但对于其他asp.net开发人员来说,这是一个很好的提示。不过谢谢。 – mmr 2010-02-02 04:18:36

相关问题