【发布时间】:2015-11-09 16:16:54
【问题描述】:
我是 php 的新手,我正在实现一个登录系统,用户输入电子邮件和密码并检查它们在数据库中的存在(phpmyadmin 中的 mysql)
用户首次注册时使用此功能对密码进行加密:
/**
* Encrypting password
*
* @param
* password
* returns salt and encrypted password
*/
public 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;
}
salt参数是解密密码的密钥,与用户信息一起存储在数据库中,解密代码为:
/**
* Decrypting password
*
* @param
* salt, password
* returns hash string
*/
public function checkhashSSHA($salt, $password) {
$hash = base64_encode ( sha1 ( $password . $salt, true ) . $salt );
return $hash;
}
当我去获取输入了电子邮件和密码的用户时,密码被解密。
/**
* Get user by email and password
*/
public function getUserByEmailAndPassword($email, $password) {
$stmt = $this->conn->prepare ( "SELECT * FROM users WHERE email = ?" );
$stmt->bind_param ( "s", $email );
if ($stmt->execute ()) {
$user = $stmt->get_result ()->fetch_assoc ();
$stmt->close ();
$salt = $user ["salt"];
$hash = $this->checkhashSSHA ( $salt, $user ["encrypted_password"] );
if ($hash == $password) {
return $user;
} else {
return NULL;
}
} else {
return NULL;
}
}
问题是当用户输入正确的电子邮件和密码时,此代码仍然返回 NULL,我怀疑处理密码部分有问题。
【问题讨论】:
-
在您的最后一个代码块中,您正在散列哈希,而不是明文密码...所以您最终将密码与哈希的哈希进行比较...
-
请注意,您正在散列密码,不是“加密”它。