【问题标题】:Storing User Names and Passwords then user wanting to retrive user information but password is Encrypted存储用户名和密码,然后用户想要检索用户信息但密码已加密
【发布时间】:2012-10-06 14:10:32
【问题描述】:

所以我一直在学习很多关于 PHP 和 Mysql 的知识,我想知道一些事情。假设我要创建一个只存储用户名和密码的数据库(保持示例简单)。我知道在不加密的情况下存储密码是不安全的,因为有人可能会侵入数据库。
所以我使用 MD5 散列或更安全的东西并加密存储密码,然后我的一个用户忘记了他们的登录信息,他们想通过电子邮件检索它。

如果我使用像 MD5 或更好的单向加密方法,如果用户的密码已加密且无法解密,我应该如何向用户发送登录信息?
我猜想为此目的(我的意思是检索部分)是否有另一种方式,或者至少是另一个地方,密码只是为此而存储的?

如果有人能提出一种安全存储这些信息的方法,我会很高兴,但如果我的一个用户忘记了他们的登录信息,我可以通过电子邮件安全地给他们发回邮件。 或者现在如何处理这样的问题?
从我读到的内容来看,MD5 散列已经被黑了,所以更好的加密散列或方法也会很好。

【问题讨论】:

  • 简单的经验法则。如果您可以将其解密以将其发送给用户 - 黑客可以
  • 是的,这就是为什么我正在寻找一种既能保证信息安全又能解决问题的好方法。
  • 保持简短,在电子邮件中给他们一个独特的链接,然后让他们重置它。没有人需要知道实际密码是什么。

标签: php mysql hash


【解决方案1】:

如果用户的密码被加密并且无法解密,我应该如何向用户发送他们的登录信息?

你不是。您永远不应该将用户密码发送给他们。

如果用户想重设密码,那么:

  1. 生成随机令牌
  2. 将该令牌存储在带有时间戳和用户 ID 的数据库中
  3. 通过电子邮件将令牌发送给用户
  4. 当用户使用令牌访问页面时,允许他们输入新密码
  5. 使用后删除令牌
  6. 如果令牌在一段时间(例如 3 小时)内未使用,则删除令牌

从我读到的内容来看,MD5 哈希已经被黑了,所以更好的加密哈希或方法会很好。

the PHP manual, this is a FAQ

另请参阅,OWASP

【讨论】:

    【解决方案2】:

    首先,不要使用 MD5。阅读我不久前发布的这个问题,它包含许多有用的链接Improve password hashing with a random salt

    然后,如果您对用户密码进行哈希处理(强烈建议这样做),您根本无法将密码发回给他们。向他们发送重置密码链接并允许他们设置新密码。就这么简单。

    【讨论】:

      【解决方案3】:

      如果您可以轻松解密密码,那么其他人也可以这样做,系统将确保

      更好的方法是您根据用户请求生成新密码并使用一些随机字符串更新密码,并通过邮件向用户发送更新的 (未加密) 密码并将其存储为加密后(例如 md5) 在数据库中... 您可以使用我的以下方法生成随机密码

      <pre>
        <?php
          $randstr = "";
               for($i=0; $i<10; $i++)
                 {
                  $randnum = mt_rand(0,61);
                   if($randnum < 10)
                   $randstr .= chr($randnum+48);
                   else if($randnum < 36)
                        $randstr .= chr($randnum+55);
                   else
                        $randstr .= chr($randnum+61);
                } 
           $original_pass=$randstr;  //Send it via E-mail
           $encrypted_pass=md5($randstr); //Store it in Database 
            ?>
      

      您还可以使用不同加密算法的组合,在前三个字母上使用 md5,在​​接下来的两个字母上使用 sha1,在接下来的字母上使用其他一些,并将用户密码限制为至少 6 个字母或更多 但是,有一些加密算法,您可以通过提供密钥来使用它们进行解密,但是其他人知道密钥也会解密它们......

      您也可以加密密钥,然后将其存储在数据库中,并在通过其他密钥解密密钥后使用它来解密密码.... 但这会增加处理时间,并且会出现时间复杂度问题。

      【讨论】:

        【解决方案4】:

        我认为您通过存储密码的哈希而不是密码本身来沿着正确的路线前进。

        如果他们忘记了,我同意因为您只有一个哈希值,所以您不能向他们显示带有密码的屏幕。但是,您可以向他们发送一封电子邮件,其中链接到允许他们重置密码的页面。

        【讨论】:

          【解决方案5】:

          您可以简单地创建一个随机密码并向他们发送激活该密码的激活链接。

          我建议您使用 md5 以外的其他东西,或者使用带有盐的 md5 或类似的东西,因为如果密码太简单,有许多在线工具可以为您提供 md5 字符串。顺便说一句,盐基本上是一组密钥,您可以将它们添加到密码中以使其更难获取。

          【讨论】:

            猜你喜欢
            • 2013-12-27
            • 2012-11-02
            • 2017-05-18
            • 2014-05-20
            • 2010-12-27
            • 2019-02-22
            • 2015-06-03
            • 1970-01-01
            • 2021-12-25
            相关资源
            最近更新 更多