使用 bcrypt 输入密码 - 忘记密码的电子邮件

Posted

技术标签:

【中文标题】使用 bcrypt 输入密码 - 忘记密码的电子邮件【英文标题】:Using bcrypt for passwords- forgotten password email 【发布时间】:2016-07-25 05:01:21 【问题描述】:

我最近为用户密码实施了 bcrypt。当用户注册时,我设法获得了哈希密码,他们可以通过相互比较来使用他们注册的密码(不是哈希版本)登录到他们的帐户。我的问题是-我正在处理一个忘记密码的电子邮件页面,该页面向用户发送一封电子邮件,说明他们的密码,但是它发送的是散列版本。有什么办法可以解决这个问题,我可以说旧的或者这是不可能的?我知道这不是很安全,但它只是我正在完成的一个小型个人项目,还没有上线。

这是我的forgot.php

<?php
if (isset($_POST['email']))
$email = $_POST['email'];
$sql="select * from user where email='$email'";
$result   = mysqli_query($mysqli_conn, $sql);
$count=mysqli_num_rows($result);

if($count==1)

    $rows=mysqli_fetch_array($result);
    $pass  =  $rows['password'];//FETCHING PASS
    //echo "your pass is ::".($pass)."";
    $to = $rows['email'];
    //echo "your email is ::".$email;
    //Details for sending E-mail
    $from = "Website";
    $url = "www.website.com";
    $body  =  "Password recovery
    -----------------------------------------------
    Url : $url;
    <br> Your email details: $to;
    <br>Here is your password  : $pass;
    <br><br>Sincerely,
    Find-a-room";
    $from = "myemail@email.com";
    $subject = "Password recovered";
    $headers1 = "From: $from\n";
    $headers1 .= "Content-type: text/html;charset=iso-8859-1\r\n";
    $headers1 .= "X-Priority: 1\r\n";
    $headers1 .= "X-MSMail-Priority: High\r\n";
    $headers1 .= "X-Mailer: Just My Server\r\n";
    $sentmail = mail ( $to, $subject, $body, $headers1 );
    else 
if ($_POST ['email'] != "") 
echo "<span> Not found your email in our database</span>";
    
    


if($sentmail==1)

    echo "<span style='color: #ff0000;'> Your Password Has Been Sent To Your 
Email Address.</span>";

    else
    
    if($_POST['email']!="")
    echo "<span style='color: #ff0000;'> Cannot send password to your e-mail 
address.Problem with sending mail...</span>";


?>

<form action="" method="post">
    <label> Enter your User ID : </label>
    <input id="email" type="text" name="email" />
    <input id="button" type="submit" name="button" value="Submit" />
</form>

【问题讨论】:

如果您对密码进行哈希处理(如您所愿),则无法再将其发送给用户。相反,创建一个一次性令牌,允许用户设置新密码并将此令牌发送给用户。 不,除非您将其保存为您无法加密的格式(这是一个坏主意),否则您不能。散列值是不可逆的。 如果您的意思是发送旧密码,如明文中的旧密码,哈希是一种方式,您不能(或至少不应该)解密它。您真正想要做的是向他们发送一个链接,他们可以访问该链接以重置在特定时间/完成后过期的密码。 此链接是否可以仅基于电子邮件发送到的用户 ID? @鸽子 如果你想一想,如果你只是有一个像example.com/reset-password.php?id=55 这样的链接并且你把它发送给用户,什么会阻止他们将 ID 从 55 更改为 1 或其他数字。谷歌上有很多比我更聪明的人,他们提供一次性链接重置密码的解决方案,一个好的起点可能是阅读OWAP's reccomendations/warnings 【参考方案1】:

哈希使用单向算法,所以你不能这样做,我也不建议以纯文本形式发送密码。

【讨论】:

以上是关于使用 bcrypt 输入密码 - 忘记密码的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

使用用户 ID 代替电子邮件发送密码恢复令牌是不是安全?

三步而不是四步忘记密码功能

忘记密码重置页面:用户是不是也需要输入用户名/电子邮件?

我要申请邮箱号,怎样申请邮箱号??

在默认的 ASP.NET Core 项目中,为啥“忘记密码”功能会要​​求用户输入两次电子邮件?

企业邮箱怎么找回密码