Пароль работает даже с лишними символами

У меня есть два метода, которые я использую. Когда пользователь создает учетную запись, я вызываю этот метод для создания безопасного хэша пароля для сохранения в базе данных:

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

Таким образом, выглядит так, как будто строка начинается с реального пароля, после чего все в порядке …

1

Решение

Это может зависеть от метода шифрования, который вы используете. В вашем примере, на самом деле пароль вы используете 8 символов?

Если это так, то любые символы после восьмого усекаются.

https://bugs.php.net/bug.php?id=11240

Чтобы избежать этого, используйте шифрование MD5.

2

Другие решения

Других решений пока нет …