Насколько строго проверять пароли?

На многопользовательском сайте, насколько строго я должен проверять пароли своих пользователей?

Я искал немного, и я только нашел вопросы о как проверить пароли пользователей. Но я знаю как создавать соленые хэши для паролей для хранения в базе данных (PHP password_hash()), и я знаю как проверить эти пароли (PHP
s password_verify()).

Я спрашиваю, какие ограничения я должен устанавливать для пользовательских паролей на моем сайте. Поскольку пароли никогда не показываются на веб-странице, я должен наложить на них строгие ограничения, такие как имена пользователей?

Я знаю, что имена пользователей отображаются и уязвимы для XSS атаки (что я запретил для имен пользователей), но пароли разные, и не могут быть взломаны таким образом (я думаю, что это так, исправьте меня, если я ошибаюсь).

Я знаю, что пароли часто являются личными и очень уникальными. Я не знаю, следует ли мне ограничивать специальные символы, которые могли бы сделать пароль более безопасным, включая специальные символы, подобные тем, которые используются при атаке XSS.

Я спрашиваю, должен ли быть разрешен какой-либо пароль (в определенных пределах); если нет, то каков рекомендуемый (безопасный) метод?

1

Решение

Вы должны разрешить любые символы в наборе символов ASCII (хотя вы могли бы разрешить Unicode если вы хотите немного сложнее, например, при использовании измерителей надежности пароля). Если вы используете bcrypt, вы должны установить максимальную длину в 72 символа ASCII, поскольку реализация PHP ограничивает хеширование только этими символами:

Использование PASSWORD_BCRYPT для параметра algo приведет к усечению параметра пароля до максимальной длины до 72 символов.

Это хорошо, так как некоторые реализации накладывают большие ограничения на длину (55 символов).

С Юникодом это тоже сложнее, так как некоторые символы могут занимать до 4 байтов. Моя рекомендация: придерживайтесь ASCII, пароли могут быть достаточно безопасными (> = 64 бита энтропии), так как это упрощает задачу, и если ваши пользователи используют менеджеры паролей (что им и следует), большинство из них поддерживают только набор символов ASCII.

XSS является проблемой, только если данные выводятся на страницу. В идеале ваша система должна реализовывать политику, согласно которой пароли вводятся только когда-либо, но никогда не выводятся (даже в <input type="password" /> поля). Это повысит безопасность паролей в долгосрочной перспективе.

1

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

Во-первых, надежность пароля.
Это важно для предотвращения подбора пароля или взлома. Чем надежнее пароль — тем лучше. Например, вы можете ограничить его минимум 10 символами, указав в нем цифры и символы верхнего регистра. Это уже достаточно сильно, но вы также можете потребовать использование таких символов, как !, $, @, #и т. д. Этот пароль будет очень безопасным.

Что касается безопасного хранения пароля — это другая тема — и вы должны никогда сохранить или показать пароль в открытом виде. Всегда хэшируйте их, например:

$password = password_hash($password, PASSWORD_DEFAULT);

И сохраните полученную строку в базе данных.
Это считается самым безопасным сегодня.

Чтобы проверить правильность введенного пароля, все, что вам нужно сделать, это использовать функцию password_verify(), чтобы сравнить введенный пароль с сохраненным хешированным.

$success = password_verify($entered_password, $hash_stored_in_mysql);

$success станет true или же falseэто все, что вам нужно знать, если пароли совпадают или нет.

Так хорошо иметь это password_hash а также password_verify сегодня люди использовали так много глупых и неправильных способов хэширования или шифрования паролей, прежде чем были добавлены эти полезные функции!

1

По вопросам рекламы [email protected]