所以我已经学习了很多关于PHP和Mysql的知识,我对此感到疑惑。假设我打算创建一个只存储用户名和密码的数据库(保持示例简单)。我知道在不加密密码的情况下存储密码是不安全的,因为有人可能会侵入数据库 因此,我使用MD5哈希或更安全的东西并存储加密的密码,然后我的一个用户忘记了他们的登录信息,他们想通过电子邮件检索它。
如果我使用像MD5这样的单向加密方法或更好的加密方法,如果密码加密且无法解密,我应该如何向用户发送登录信息? 我想为此目的(我的意思是检索部分)是否有另一种方式,或至少另一个地方,密码存储只是为了这个?
如果有人能建议一种安全存储这些信息的方法,我会很高兴,但如果我的一个用户忘记登录,我就有办法安全地给他们发电子邮件。 或者现在如何处理这样的问题呢? 从我所看到的MD5哈希已被黑客入侵,所以更好的加密哈希或方法也会很好。
答案 0 :(得分:5)
那么,如果用户的密码已加密且无法解密,我应该如何向用户发送他们的登录信息?
你不是。您永远不应该向他们发送用户密码。
如果用户想要重设密码,请:
从我读到的内容来看,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的字符串。顺便说一句,盐基本上是一组密钥,你可以添加到密码中以使其更难获取。