【问题标题】:How do I authenticate and validate a password?如何验证和验证密码?
【发布时间】:2011-10-23 01:15:49
【问题描述】:

我什至不知道在这里问什么问题。我的问题陈述很简单:我需要用盐在数据库上存储密码,根据存储的密码验证输入的密码,并在用户尝试登录时使用随机挑战词验证密码。我正在使用 php/javascript。

在试图解决这个问题时,我遇到的问题是,如果我以 html 形式传递一个挑战词,然后用该词对输入的密码进行哈希处理,我可以在服务器上验证密码,但我可以不要将密码与挑战词分开,以便我可以根据数据库上的加盐密码对其进行验证。如果我将密码以明文形式发送到服务器或在没有挑战词的情况下对其进行哈希处理,我可以验证它,但现在我无法可靠地验证它。

我认为我需要某种 2 路算法,以便我可以使用密钥对其进行加密,然后在验证密码时验证密钥。我该怎么做?或者如果它不能完成那我该怎么办?

【问题讨论】:

  • 要清楚,随机挑战是为了在传输过程中保护密码?或者是一种身份验证机制来证明他们是人类或类似的?
  • 为了弄清楚这一点,我查看了一个名为“Geeklog - The Secure CMS”的 php 博客的源代码。瞧,他们免费且清晰地发送用户密码,并使用服务器上的 MD5 对密码进行“编码”。所以也许我的问题应该是“对于什么类型的系统,我应该使用盐和挑战词实现密码验证和身份验证?”
  • phpBB 似乎也可以免费且清晰地发送密码。我想我是在思考这个问题。
  • @majicbunnie 是的,我想我需要在传输过程中使用挑战词来保护密码。然后我需要一种方法将其与数据库上的加盐密码进行比较,但没有任何方法可以做到这一点..
  • @David Schwartz 提供的解决方案似乎可以满足您的需求,添加 SSL 层也是个好主意。当然,您是对的,根据您的情况,这可能是矫枉过正。一个简单的 SSL 登录系统,后端带有哈希(盐 + 密码),可能足以满足您的安全需求。

标签: php validation authentication


【解决方案1】:

使用客户端脚本加密密码通常是个坏主意。正确的做法是使用 SSL。

另外,从不以明文形式存储密码。如果您必须使用上述方法,请将密码哈希两次:一次用于将其存储在数据库中,另一次用于双向身份验证。

【讨论】:

    【解决方案2】:
    1. 要存储密码,请生成随机盐。存储HASH(password+salt)salt。 (服务器或客户端都可以进行此计算。)

    2. 要执行身份验证,服务器会查找 saltHASH(password+salt)。然后它会生成一个随机挑战并将盐和挑战发送给客户端。

    3. 在客户端上,提示用户输入密码。计算:
      HASH( HASH(password+salt) + challenge)。发送到服务器。

    4. 在服务器上,您已经拥有HASH(password+salt) 并且拥有challenge。所以你也可以计算:
      HASH( HASH(password+salt) + challenge)。将此与客户发送给您的内容进行比较。如果匹配,则密码正确。

    请注意,这很容易受到 MITM 攻击,因此应该在本身受到 MITM 保护的连接上使用它,例如 SSL 连接。

    【讨论】:

    • 这听起来像我想要一个两步登录过程:1)用户提交用户名,服务器查找用户并发送盐和挑战 2)用户输入密码并提交。
    • 在将密码发送到服务器之前在客户端对密码进行哈希处理没有任何好处。这只是不必要地使客户端代码复杂化。
    • 优点是服务器不能放弃密码。例如,服务器经常会记录密码,而这些日志文件有时会受到损害。如果服务器没有看到密码,它就无法记录或破坏它。 (这是否值得努力是另一个问题。)
    • 服务器记录密码的唯一方法是记录登录页面中的所有帖子变量。这需要时间来设置,并且大多数标准服务器日志记录机制既不自动也不支持。换句话说,你必须竭尽全力做到这一点。
    • @DavidSchwartz 那么,两步登录呢?
    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 2011-01-24
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多