【问题标题】:Dual password authentication双重密码认证
【发布时间】:2015-11-18 20:08:45
【问题描述】:

我决定在最近的一个项目中从双重密码身份验证开始。 登录详细信息是:电子邮件、密码、密码。

密码(最少 8 个字符)和秘密(最少 6 个字符)是两个密码。

为了使破解它们尽可能困难,我认为我应该使用 openssl 加密用户名,并使用两个密码作为加密密钥和初始化向量。

openssl_encrypt($email, 'aes-256-cbc', $password, false, $secret)

这是安全的还是我只是想出了一个坏主意?

【问题讨论】:

  • 看看password_hash,它是单向哈希,php.net/manual/en/function.password-hash.php
  • 这需要我存储密码。我的想法是不存储密码,只存储基于它们的加密用户名
  • 是什么让您认为两个密码比一个更好?这不是两因素身份验证,通常意味着以下两个:您知道的东西(例如:密码)、您拥有的东西(例如:RSA fob)或您的身份(例如:指纹)。
  • 我的 SME 提到双密码更安全,但前提是您有双重监护权。
  • 是的,双重监管可以大大提高安全性,但即使没有双重监管,您仍然会强制用户提供更多角色,从而增强实力。 8 个字符的密码不如 8 个字符中的两个安全。这使得构建彩虹表变得非常困难。

标签: php security authentication passwords


【解决方案1】:

这是安全的还是我只是想出了一个坏主意?

你是rolling your own crypto,所以从这个意义上说是个坏主意。

至于安全性:openssl_encrypt() 期望 $password 参数是加密密钥,而不是人类可读的密码。同样,IV 应该是每个消息的随机字符串。对两个输入都使用人类可读的值是危险的。 (具体来说,你更容易受到暴力破解。)

听起来您想使用password_hash() + password_verify(),然后为您的“秘密”字段集成双因素身份验证解决方案(例如Yubikey,Google Authenticator)。

【讨论】:

    【解决方案2】:

    您需要在数据库中保存某种信息。您正在做的事情与主要完成的事情以及 Andrew 在上面发布的内容非常相似。安全地散列密码的一般方法是为每个用户生成某种唯一的盐,在您的情况下,您决定基于秘密进行此操作,但您可以安全地使用某种随机信息。

    然后,您使用此盐对此密码进行哈希处理,并将盐和哈希密码保存在您的数据库中。当用户输入密码进行验证时,您只需使用该用户的盐对其进行哈希处理,如果它与哈希值匹配,则他们已成功通过身份验证,但是由于您对密码进行哈希处理的方式,这使得获得访问权限的人变得困难到您的数据库以逆转此过程,因为他们需要单独破解每个密码(或使用彩虹表/等做一些事情)。

    您发布的是上述标准的一个版本。

    【讨论】:

    • “你然后使用这个盐来散列这个密码” - 如果这是对 password_hash() 的引用,额外的盐分已经从 PHP 7.0 中删除,建议不要创建他们自己的盐。
    • 我指的是一般生成安全哈希的过程,而不是专门针对 password_hash 函数。不过还是谢谢你!
    • 所以我认为我的方法同样安全?
    • 我没有在数据库中保存密码而不是盐。我只根据密码和秘密保存加密的电子邮件。
    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多