我有一个小型社区网站,需要实现一些类似于忘记密码的功能。目前我将密码存储在数据库中,使用 MD5
进行加密。
是否有可能对其进行“解密”并通过电子邮件发送给用户,或者我需要设置一个密码重置页面?
我有一个小型社区网站,需要实现一些类似于忘记密码的功能。目前我将密码存储在数据库中,使用 MD5
进行加密。
是否有可能对其进行“解密”并通过电子邮件发送给用户,或者我需要设置一个密码重置页面?
$token = md5(microtime (TRUE)*100000);
$tokenToSendInMail = $token;
$tokenToStoreInDB = hash($token);
其中 hash 是一种哈希算法。
random_bytes
。在PHP5中,应该使用兼容实现或openssl_random_pseudo_byte
。 - Gert van den Bergpassword_hash
在长字符串上生成令牌,并在链接中发送哈希值的base64编码版本)。 (在存储在数据库之前再次进行哈希可能也是一个选项,但在4-24小时后过期重置链接可能是更好的防御措施)(使用适当的随机数据,只需发送经过base64编码的数据即可)。 - Gert van den Berg你不能解密密码,而且你甚至不应该考虑以明文形式向用户发送密码。(这是让我再也不会使用某个网站的最大安全漏洞)提供一个密码重置页面,该页面由包含与时间相关的密钥的链接触发,该链接将发送到用户的密码恢复电子邮件中;这是密码恢复领域中最先进的技术。
对于你来说最好的做法是在注册时要求用户提交他们的电子邮件地址。如果他们忘记了密码,可以提供一个“忘记密码”的链接,该链接会将其密码重置为随机值并通过电子邮件发送给他们,以便他们可以获得访问权限,然后将密码更改为更易记的内容。这样,您就不需要妥协安全性。 您可以提供一个只需提交用户名的链接,但出于更好的安全性考虑,您应该提供一个问题和答案或易记单词。
正如Marcus Reed所述,如果您的PHP版本>=5.5,不要使用MD5,可以使用password_hash()和password_verify()为密码提供简单安全的哈希,并且能够提供成本并自动添加盐到哈希中。
由于我目前没有投票或评论的权限,因此我提供了一个明确的声明以避免混淆。
编写一个页面,接受md5和电子邮件地址作为get参数,并在数据库中查找电子邮件和md5加密的密码。按照Jared Cobb的笔记,这应该可以让您走上正确的道路。我也添加了一些示例。
例如,发送url:http://yourdomain.com/resetpassword.php?code=md5codesentviaemail
$code = isset($_GET['code']) ? $_GET['code'] : '';
$email = isset($_GET['email']) ? $_GET['email'] : '';
$checkPw = '';
if(empty($code) || empty($email))
{
die();
}
$sqlQuery = 'SELECT * FROM users WHERE email = "'.$email.'";
//remember to check for sql injections
//then get the results as an array, i use a database class eg $user
if(!empty($user['password']))
{
$checkPw = md5($user['password']);
}else
{
die();
}
if($checkPw !== $code)
{
die();
}else
{
//display form for user to change password
}
这足以表明用户是有效用户并更改其密码。
MD5是一种单向哈希算法。您需要重置他们的密码。
不,你不能解密它。这就是整个想法。
你需要发送给他们一个临时密码并让他们重置它。