存储用户名和密码然后用户想要检索用户信息但密码是加密的

时间:2012-10-16 13:03:16

标签: php mysql hash

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

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

如果有人能建议一种安全存储这些信息的方法,我会很高兴,但如果我的一个用户忘记登录,我就有办法安全地给他们发电子邮件。 或者现在如何处理这样的问题呢? 从我所看到的MD5哈希已被黑客入侵,所以更好的加密哈希或方法也会很好。

5 个答案:

答案 0 :(得分:5)

  

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

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

如果用户想要重设密码,请:

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

    从我读到的内容来看,MD5哈希已被黑客攻击,因此更好的加密哈希或方法会很好。

    请参阅the PHP manual, this is a FAQ

    另见OWASP

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

更好的方法是根据用户请求生成新密码&使用一些随机字符串更新密码,并通过邮件发送用户更新的(UN加密)密码,并将其存储为加密后(例如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个字母或更多的密码 但是,有一些加密算法,您可以通过提供密钥使用它们进行解密,但其他人知道密钥也会解密它们......

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

答案 3 :(得分:0)

我认为你是通过存储密码的哈希而不是密码本身来实现正确的。

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

答案 4 :(得分:0)

您只需创建一个随机密码,然后向他们发送一个激活该密码的激活链接。

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