代码之家  ›  专栏  ›  技术社区  ›  recursive

安全用户身份验证-我做得对吗?

  •  0
  • recursive  · 技术社区  · 17 年前

    我正在为一位客户开发一个Asp.NET网站,并希望确保我使用的是安全的身份验证方案。

    在我的用户表中,我有一个身份验证哈希列,计算为 sha1(salt + username + password) . 该站点通过HTTPS提供服务。要登录,用户通过HTTPS提交其姓名和密码。web服务器计算散列,并将其与数据库存储值进行比较以进行身份验证。

    这听起来合理安全吗?我在一个朋友面前运行了这个计划,他说它容易受到邪恶的系统管理员的攻击。他说我应该做以下几件事:

    • 每次提供登录页面时,服务器都指定一个唯一的salt。
    • 提交前,通过javascript将密码散列到客户端上的唯一salt。
    • 发送此哈希以进行身份验证,但不发送密码。
    • 做一些我不懂的花哨的废话来验证散列。

    我该怎么办?

    6 回复  |  直到 17 年前
        1
  •  7
  •   Matthew Dresser    17 年前

    不要重新发明轮子,只要使用它 .Net Membership .

        2
  •  4
  •   Eric Smith    17 年前

    否则,请确保您的盐是长的,并使用适当的随机熵。同时确保使用SHA-2而不是SHA-1,因为SHA-1是 considered broken .

        3
  •  4
  •   Spencer Ruport    17 年前

    这听起来合理安全吗?我 让我的一个朋友知道了这个计划, 他说它很容易受到攻击

    • 通过javascript将密码散列到客户端上的唯一salt 提交前。
    • 发送此哈希以进行身份验证,但不发送密码。
    • 做一些我不懂的花哨的废话来验证散列。

    听起来他在建议一个与SSL结合的挑战响应方案。这是一个很好的方法,但让我一步一步地解释清楚。

    注册后,密码通过ssl发送到服务器。这应该是唯一一次直接发送密码。服务器生成salt并存储以下哈希:

    hash = sha1(password + salt)
    

    服务器还应该存储盐。

    当客户端访问登录页面时,服务器应在表中生成一条记录,其中包含ID和质询值。然后,服务器应将ID、存储的salt和质询值发送给客户端。

    当客户端准备登录时,您应该有一个javascript函数来生成质询和哈希,如下所示:

    hash = sha1(sha1(password + server_salt) + server_challenge + client_challenge)
    

    hash = sha1(stored_hash + server_challenge + client_challenge)
    

        4
  •  3
  •   Joel Coehoorn    17 年前

    请阅读以下内容:
    Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes

    我们学到了什么?
    …如果它是2007年的,彩虹表攻击点燃了你,我们了解到,你应该回到1975年,等待30年,然后再尝试设计密码哈希方案。
    …我们应该咨询安全领域的朋友和邻居,以获得密码方案方面的帮助。

    …如果我们想安全地存储密码,我们有三个合理的选择:PHKs MD5方案、Provos Mazieres Bcrypt方案和SRP。我们知道正确的选择是Bcrypt。

    这里的要点是:

    • 无论您做什么,都不要尝试从头构建自己的身份验证代码
    • Bcrypt是对密码进行哈希运算的最佳选择。
        5
  •  2
  •   Kelsey    17 年前

    您的密码在SSL下,因此您可以发送无凭据文本,因为该行已加密,然后将规则应用于salt/hash您的密码,以便在服务器端进行比较。这样,没有人知道你是如何加密密码的。将信息存储在客户端javascript中只是将这些信息泄露出去。

    除此之外,您的方法看起来是正确的。我假设您需要一个定制的解决方案,而不是出于任何原因的内置解决方案。

        6
  •  2
  •   MyItchyChin JNK    17 年前

    你的朋友认为盐应该是独一无二的,这是正确的,但是他在处理盐方面是错误的。

    • 提交。

    这就要求你要么为每个人使用相同的盐,要么知道用户是谁,这样你就可以向他们发送他们独特的盐。盐不能离开服务器。

    推荐文章