我正在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;
}
您的代码中有很多问题。
首先,SHA512不是哈希密码的好选择,因为它太快了Bcrypt是专门为散列密码而设计的,因此速度较慢(需要计算时间)。建议使用像phpass这样建立良好的库,如果你想了解如何实现它,你可以阅读这篇文章,我在文章中试图解释最重要的一点。
1) 代码中的第一个问题可能是,mhash()
为您的salt生成二进制输出。我不知道为什么要将它附加到密码哈希中(这不是应用salt的方式),但变量$encrypted
之后将包含二进制数据。
2) 这导致了第二个问题,即将变量插入到更新语句中。在sql中插入二进制数据将导致一条无效的语句。在将数据添加到sql语句之前,您应该始终转义数据,在您的情况下,请使用mysql_escape_string()
。
3) 下一个问题是,不赞成使用mysql_*函数,而是使用mysqli或PDO进行数据库访问。
4) 我们在问题2中已经遇到的另一个问题是,如果不转义数据,您很容易受到SQL注入攻击。想象一下,有人可以用这个用户输入做什么。。。
其中电子邮件='abc' OR email <> '
'
他可以一次重置所有用户的密码!
也就是说,我真的建议你重新考虑使用Bcrypt。