1

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

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

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

4

5 回答 5

5

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

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

如果用户想要重置他们的密码,那么:

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

从我读到的 MD5 散列已经被黑了,所以更好的加密散列或方法会很好。

请参阅PHP 手册,这是一个常见问题解答

另见,OWASP

于 2012-10-16T13:08:01.147 回答
1

首先,不要使用 MD5。阅读我不久前发布的这个问题,它包含许多有用的链接使用随机盐改进密码散列

然后,如果您散列用户密码(强烈推荐),您根本无法将密码发回给他们。向他们发送重置密码链接并允许他们设置新密码。它是如此简单。

于 2012-10-16T13:06:30.653 回答
1

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

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

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

于 2012-10-16T13:19:19.737 回答
0

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

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

于 2012-10-16T13:06:37.337 回答
0

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

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

于 2012-10-16T13:10:29.730 回答