0

我正在我的 android 应用程序中实现密码更改功能,并在我的 php 文件中编码了密码哈希。用户可以更改密码,密码存储在数据库中。当我尝试使用电子邮件和新密码登录时,它告诉我密码错误。我在哪里为我的 php 文件做错了?

这是我的 php 文件代码:

<?php

// array for JSON response
$response = array();

function hashSSHA($newpassword) {
    $salt = mhash('sha512', rand());
    $salt = substr($salt, 0, 15);
    $encrypted = hash('sha512', $newpassword . $salt, true) . $salt;
    $hash = array("salt" => $salt, "encrypted" => $encrypted);
    return $hash;
}

// check for required fields
if (isset($_POST['email']) && isset($_POST['newpassword'])) {
    $email = $_POST['email'];
    $newpassword = $_POST['newpassword'];

    // include db connect class
    require_once __DIR__ . '/db_connect.php';

    // connecting to db
    $db = new DB_CONNECT();

    // TESTING HERE FOR STORING NEW PASSWORD INTO DATABASE
    $hash = hashSSHA($newpassword);
    $encrypted_password = $hash["encrypted"]; // encrypted password
    $salt = $hash["salt"]; // salt

    $result = mysql_query("UPDATE users SET encrypted_password = '$encrypted_password', salt = '$salt' WHERE email = '$email'");

    // check if row inserted or not
    if ($result) {
        // successfully updated
        $response["success"] = 1;
        $response["message"] = "Password successfully changed";

        // echoing JSON response
        echo json_encode($response);
    } else {
        $response["success"] = 0;
        $response["message"] = "Password change failed";
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}
?>

编辑 这是我的解密功能

// DECRYPTING user currentpassword
function checkhashSSHA($salt, $currentpassword) {

$hash = hash('sha512', $currentpassword . $salt, true) . $salt;
return $hash;
} 
4

1 回答 1

1

你的代码有很多问题。

首先,SHA512 不是哈希密码的好选择,因为它太快了。Bcrypt是专门为散列密码而设计的,因此速度很慢(需要计算时间)。建议使用完善的库,如phpass,如果您想了解如何实现它,可以阅读这篇文章,我试图解释最重要的点。

1)您的代码中的第一个问题可能是mhash()为您的盐生成二进制输出。我不知道你为什么将它附加到你的密码哈希中(这不是应该应用盐的方式),但该变量$encrypted之后将包含二进制数据。

2)这导致了第二个问题,您将变量插入到更新语句中。将二进制数据插入 sql 会导致语句无效。在将数据添加到 sql 语句之前,您应该始终转义数据,在您的情况下使用mysql_escape_string().

3) 下一个问题是,不推荐使用 mysql_* 函数,而是使用 mysqli 或 PDO 进行数据库访问。

4) 我们在问题 2 中已经遇到的另一个问题是,如果不转义您的数据,您很容易受到 SQL 注入攻击。想象一下有人可以用这个用户输入做什么......

WHERE 电子邮件 = ' abc' OR email <> ''

...他可以一次重置所有用户的密码!

也就是说,我真的建议您重新考虑使用 Bcrypt。

于 2012-09-06T20:08:15.093 回答