У вас есть компромисс между информацией, предоставленной пользователю, и защитой от атак.
Если вы запрашиваете в своей базе данных проверку на наличие соответствующего логина и пароля, и она не срабатывает, вы можете только сказать пользователю, что логин или пароль ошибочны. Не помогает, если он не помнит, какой логин вы использовали для регистрации (это был "Арх01", "Арх" или "Арх1").
Если вы запрашиваете в своей базе данных логин, получая хеш и соль, вы можете сообщить пользователю, если логин неправильный или пароль. Пользователь счастлив. Но кто-то, нападающий на ваш сайт, может легко узнать, что пользователь «aa» не существует, а пользователь «a» существует. Поскольку многие веб-сайты предоставляют доступ к списку пользователей, вы почти всегда можете отклонить эту проблему.
Чтобы предотвратить грубое насилие, зарегистрируйте количество попыток, сделанных IP или входом в систему, и заблокируйте любую дальнейшую попытку после 5-ти ошибок. Желательно заблокировать используемый IP, а не аккаунт.
О хранении хешированных паролей, используйте соли и hmac + sha512 в php: hash_hmac