这种认证方法是否安全?

时间:2010-11-06 21:16:39

标签: security authentication servlets login

我处在一种需要为Web应用程序创建自己的身份验证的情况,我希望得到一些关于我的方法安全性的输入。

差不多,这是我将遵循的逻辑:

注册:

  1. 用户通过HTTPS发送用户名和密码。
  2. 密码将使用SHA1加密并存储在数据库中。
  3. 登录:

    1. 用户通过HTTPS提供用户名和密码。
    2. 密码转换为SHA1并与数据库中的密码进行比较

      如果密码匹配

      the users id will be stored in their session under the user_id key.
      

      ELSE

      the user will be directed back to the login page
      
    3. 在需要身份验证的网页之前执行的逻辑:

      1. 将检查用户的会话以查看他们的ID是否已存储

        如果在会话中找到用户的ID

         user is permitted to view the page
        

        ELSE

         user is given a 404 response.
        
      2. 这有多安全?我错过了我应该做的任何事情吗?

        感谢您的意见。

        更新:

        有些人想要我正在使用的环境 - 我在java servlet环境中工作。据我所知,java在服务器上存储会话,并将sessionid存储在cookie中。这让我想知道java的HttpSession是否有措施确保某人的会话密钥不会被盗?

3 个答案:

答案 0 :(得分:3)

您还应该使用随机per-user salt。这样,如果数据库被盗,则必须按用户进行破解,并且他们无法利用,例如,已知的SHA1总和(像this这样的网站),已知的彩虹表或两个密码相同的用户。

答案 1 :(得分:3)

除了马修已经说过的话,这部分似乎还可以。你还应该考虑一些事情:

答案 2 :(得分:2)

你必须强迫人们更改他们忘记的密码,因为你无法向他们发送密码。

如果您只使用会话,您将无法实现“记住我”类型的功能。为此,您必须在客户端浏览器上存储cookie。那时只存储用户ID将是一个可怕的想法。你应该生成某种单独的标记,比如guid,或者一些独特的随机字符串和地图。

而不是404响应,您应该将用户带到登录屏幕(如果他们的会话超时)并且如果他们成功登录,则将他们重定向到他们首先尝试的地方,但是至少发送失败与禁止或未经授权有关的事情。

您可能希望添加验证码以防止可以执行强力尝试使用常用密码的脚本。

您可能希望有一个失败尝试的计数器,并阻止在短时间内失败太多次的帐户,例如15分钟。