У меня есть два метода, которые я использую. Когда пользователь создает учетную запись, я вызываю этот метод для создания безопасного хэша пароля для сохранения в базе данных:
public function createPassword($password){
$salt = hash("sha256", time() . uniqid() . rand(1, 1000));
return crypt($password, $salt);
}
Он возвращает соль, которую я затем сохраняю в базе данных в столбце пароля.
Затем, когда пользователь входит в свою учетную запись, я выбираю его информацию из базы данных и передаю ее этой функции, которая затем должна подтвердить свой пароль.
public function verifyPassword($password, $salt){
if(crypt($password, $salt) == $salt){
return true;
}
return false;
}
Проблема в том, что я нашел пароль, который, если я добавлю правильный пароль, будет работать, но если я добавлю дополнительные символы в конец пароля, он все равно будет работать. Этого не должно быть. я делаю что-то не так или это ошибка в php?
В целях безопасности я не использую реальный пароль ниже
// Create during registration
$salt = $obj->createPassword('abc123');
// Save to database here
затем:
// Get row from database save array $row
if($obj->verifyPassword($_POST["passwd"], $row["password"])){
// Log user in
}
Вот мои тесты:
abc123 // Works
abc12 // doesn't work
abc12jfjf // doesn't work
abc123123 // Works
abc123asdfadffa // Works
Таким образом, выглядит так, как будто строка начинается с реального пароля, после чего все в порядке …
Это может зависеть от метода шифрования, который вы используете. В вашем примере, на самом деле пароль вы используете 8 символов?
Если это так, то любые символы после восьмого усекаются.
https://bugs.php.net/bug.php?id=11240
Чтобы избежать этого, используйте шифрование MD5.
Других решений пока нет …