PHP用户通过电子邮件和旧密码更改其帐户的密码

时间:2013-12-28 18:09:08

标签: php mysql database hash change-password

我已经在php中创建了一个API,用户可以在他们的帐户上更改密码,但我这样做是为了让他们通过输入他们的电子邮件来更改密码,所以我在数据库中找到他们的列,但出于安全考虑我不认为这是一个好主意...所以我想添加它,以便通过电子邮件找到用户然后检查他的旧输入的密码是否与数据库中的加密匹配,所以他的输入将是1)电子邮件2)旧通3)新通行证。我的密码使用hash + salt加密

这是我的php文件

<?php
require_once('connection.php');

function forgotPassword($forgotpassword, $newpassword, $salt){
    $result = mysql_query("UPDATE `member` SET `encrypted_password` = '$newpassword',`salt` = '$salt' WHERE `email` = '$forgotpassword'");
    if ($result) {
    return true;
    }
    else
    {
    return false;
    }
}
function hashSSHA($password) {
    $salt = sha1(rand());
    $salt = substr($salt, 0, 10);
    $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
    $hash = array("salt" => $salt, "encrypted" => $encrypted);
    return $hash;
}
function isUserExisted($email) {
    $result = mysql_query("SELECT email from member WHERE email = '$email'");
    $no_of_rows = mysql_num_rows($result);
    if ($no_of_rows > 0) {
        // user existed
        return true;
    } else {
        // user not existed
        return false;
    }
}

$email = $_POST['email'];
$newpassword = $_POST['newpas'];
$hash = hashSSHA($newpassword);
$encrypted_password = $hash["encrypted"]; // encrypted password
$salt = $hash["salt"];
if (isUserExisted($email)) {
        $user = forgotPassword($email, $encrypted_password, $salt);
    if ($user) {
    //pass changed
}
else {
    //error
}
    // user is already existed - error response
}
   else {
    //user not found
}
?>

有人能为我写一个解决方案吗?因此,它会检查数据库中的电子邮件和旧密码。

3 个答案:

答案 0 :(得分:0)

您正在寻找的声音是简单的密码验证。在您的情况下,它看起来像:

function checkPass ($salt, $password, $storedPass){
  $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
  if($storedPass==$encrypted){
    return TRUE;
  }
  else{
    return FALSE;
  }

当然,您必须首先从数据库中挖掘$salt的值。

答案 1 :(得分:0)

如果我理解正确您正在寻找Forgot Password的解决方案。如果是这种情况,显而易见的情况是用户不记得当前密码并想要设置新密码。

我假设您有一个Forgot Password链接指向Forgot Password页面,用户可在其中输入Email Address并点击下一步。

如果您的系统已经存储了秘密问题和答案,您可以添加步骤来检查其中至少一个,否则只需继续:

  • 验证Email Address
  • 如果Email Address存在,请继续。否则向用户显示消息。
  • 生成(冗长)Random String
  • Random String保存在该用户的(用户)表中。
  • 制作Link并将Email AddressRandom String放入其中。
  • 发送包含Link的电子邮件,并将其发送至Email Address

现在,用户会收到该电子邮件并点击Link

  • 解析Link以获取Email AddressRandom String
  • 验证Email AddressRandom String
  • 如果存在Email AddressRandom String组合,请继续。否则向用户显示消息。
  • 显示表单,供用户输入New Password两次。
  • 为用户保存New Password

现在,您可以自动Sign In用户或显示Sing In页面,以便用户使用新凭据登录。

答案 2 :(得分:0)

好的所以,如果用户已登录并打算更改密码:

假设您有一个Change Password链接:

当用户点击Change Password链接:

  • 显示Change Password表单。
  • 用户输入Old Password
  • 用户输入New PasswordRetype New Password

用户已登录,您可以拥有userId或emailAddress,也可以从(用户)表中检索。

现在:

  • 验证旧密码。
  • 确保New PasswordRetype New Password相同。
  • 确保新密码符合您的密码标准。
  • 一切都很好,保存新密码。

现在,如果您的系统允许多个用户登录同一帐户,则最好自动退出所有这些用户并要求再次登录。