Лучшая мысль - не изобретать велосипед. Но, как я понимаю, в мире PHP может быть трудно найти высококачественный компонент, который уже это делает (даже я уверен, что фреймворки реализуют такие вещи, и их реализации уже протестированы, надежны, проверены на код и т. Д.). )
Если по каким-то причинам вы не можете использовать фреймворк, вот несколько советов:
Используйте PBKDF2 или Bcrypt, если можете . Это сделано для этого.
Обоснование: оба алгоритма могут сделать процесс хеширования сколь угодно медленным, а это именно то, что вам нужно при хешировании паролей (более быстрые альтернативы означают более простую грубую силу). В идеале вам следует настроить параметры таким образом, чтобы процесс становился все медленнее и медленнее со временем на одном и том же оборудовании, в то время как выпускается новое, более быстрое оборудование.
Если вы не можете, по крайней мере , не используйте MD5 / SHA1. Никогда. Забудь об этом . Используйте вместо этого SHA512, например. Используйте соль тоже.
Обоснование: MD5 и SHA1 слишком быстрые. Если злоумышленник имеет доступ к вашей базе данных, содержащей хэши, и имеет (даже не особенно) мощную машину, взлом паролей происходит быстро и легко. Если нет никаких солей, вероятность того, что злоумышленник найдет действительный пароль, возрастет (что может нанести дополнительный вред, если пароль был повторно использован где-то еще).
В PHP 5.5.0 и более поздних версиях используйте password_hash
и password_verify
.
Обоснование: вызвать функцию, предоставляемую платформой, легко, поэтому риск ошибиться уменьшается. С этими двумя функциями вам не нужно думать о различных параметрах, таких как хеш. Первая функция возвращает одну строку, которая затем может быть сохранена в базе данных. Вторая функция использует эту строку для проверки пароля.
Защитите себя от грубой силы . Если пользователь отправляет неверный пароль, когда он уже отправил другой неверный пароль 0,01 секунды назад, это хорошая причина заблокировать его. В то время как человеческие существа могут вводить быстро, они , вероятно , не может быть , что быстро.
Еще одна защита - установить ограничение на количество отказов в час. Если пользователь отправил 3600 неправильных паролей в час, 1 пароль в секунду, трудно поверить, что это законный пользователь.
Обоснование: если ваши пароли хешируются небезопасным способом, грубая сила может быть очень эффективной. Если пароли хранятся безопасно, грубая сила все еще тратит ресурсы вашего сервера и пропускную способность сети, что приводит к снижению производительности для законных пользователей. Обнаружение грубой силы нелегко развить и получить правильно, но для любой, кроме крошечной системы, оно того стоит.
Не просите пользователей менять свои пароли каждые четыре недели. Это очень раздражает и снижает безопасность, так как поощряет безопасность после ее завершения.
Обоснование: идея о том, что принудительное изменение паролей каждые n недель защищает систему от перебора, ошибочна. Атаки грубой силой обычно успешны в течение нескольких секунд, минут, часов или дней, что делает ежемесячные изменения пароля несущественными. С другой стороны, пользователи плохо запоминают пароли. Кроме того, если им необходимо изменить их, они либо попытаются использовать очень простые пароли, либо просто запомнят свои пароли на пост-своей.
Аудит все, каждый раз. Храните входы в систему, но никогда не сохраняйте пароли в журнале аудита. Убедитесь, что журнал аудита не может быть изменен (т.е. вы можете добавлять данные в конце, но не изменять существующие данные). Убедитесь, что журналы аудита подлежат регулярному резервному копированию. В идеале журналы должны храниться на выделенном сервере с очень ограниченным доступом: если взломан другой сервер, злоумышленник не сможет стереть журналы, чтобы скрыть свое присутствие (и путь, выбранный во время атаки).
Не запоминайте учетные данные пользователя в файлах cookie, если только пользователь не просит сделать это (флажок «Запомнить меня» должен быть по умолчанию снят, чтобы избежать человеческих ошибок).