Найкраще думати - не винаходити колесо. Але я розумію, що в світі PHP може бути важко знайти високоякісний компонент, який це вже робить (навіть я впевнений, що рамки реалізують такі речі, а їх реалізація вже перевірена, міцна, переглядається код тощо). )
Використовуйте PBKDF2 або Bcrypt, якщо можете . Зроблено для цього.
Обґрунтування: обидва алгоритми можуть зробити процес хешування довільно повільним, що саме те, що ви хочете, коли хешувати паролі (більш швидкі альтернативи означають більш легку грубу силу). В ідеалі слід налаштувати параметри так, щоб процес ставав повільнішим і повільнішим з часом на тому ж апаратному забезпеченні, в той час як випускається нове, швидше обладнання.
Якщо ви не можете, принаймні не використовуйте MD5 / SHA1. Ніколи. Забудь про це . Наприклад, використовуйте SHA512. Вживайте і сіль.
Обгрунтування: MD5 та SHA1 занадто швидкі. Якщо зловмисник має доступ до вашої бази даних, що містить хеші, і має (навіть не особливо) потужну машину, грубе нанесення пароля швидко і легко. Якщо немає солей, шанси на те, що зловмисник знайде фактичний пароль, збільшується (що може принести додаткову шкоду, якщо пароль буде повторно використаний десь в іншому місці).
У PHP 5.5.0 та пізніших версіях використовуйте password_hash
та password_verify
.
Обґрунтування: викликати функцію, надану рамкою, легко, тому ризик помилки зменшується. За допомогою цих двох функцій вам не доведеться думати про різні параметри, наприклад хеш. Перша функція повертає один рядок, який потім може зберігатися в базі даних. Друга функція використовує цей рядок для перевірки паролем.
Захистіть себе від жорстокої сили . Якщо користувач подає неправильний пароль, коли вона вже подала інший неправильний пароль 0,01 секунди тому, це хороший привід заблокувати його. У той час як людські істоти можуть вводити швидко, вони , ймовірно , не може бути , що швидко.
Іншим захистом було б встановлення погодинної межі відмов. Якщо користувач подав 3600 неправильних паролів за годину, 1 пароль в секунду, важко повірити, що це законний користувач.
Обгрунтування: якщо ваші паролі хешируються небезпечно, груба сила може бути дуже ефективною. Якщо паролі зберігаються безпечно, груба сила все ще витрачає ресурси вашого сервера та пропускну здатність мережі, що призводить до зниження продуктивності для законних користувачів. Виявити грубу силу непросто і правильно, але для будь-якої, крім крихітної системи, це абсолютно варто.
Не вимагайте від користувачів змінювати свої паролі кожні чотири тижні. Це надзвичайно дратівливо і знижує безпеку, оскільки це заохочує безпеку після її використання.
Обґрунтування: думка про те, що примушування змін паролів кожні n тижнів захищає систему від грубої сили, є помилковою. Атаки з грубою силою зазвичай є успішними протягом декількох секунд, хвилин, годин або днів, що робить щомісячні зміни пароля неактуальними. З іншого боку, користувачі погано запам’ятовують паролі. Якщо, крім того, їм потрібно буде їх змінити, вони або спробують використовувати дуже прості паролі, або просто відзначать свої паролі на пост-його.
Кожен раз перевіряйте все. Зберігайте логотипи, але ніколи не зберігайте паролі в журналі аудиту. Переконайтесь, що журнал аудиту неможливо змінити (тобто ви можете додавати дані наприкінці, але не змінювати існуючі дані). Переконайтеся, що журнали аудиту підлягають регулярному резервній копії. В ідеалі журнали повинні зберігатися на спеціалізованому сервері з дуже обмежувальним доступом: якщо інший сервер зламаний, зловмисник не зможе стерти журнали, щоб приховати свою присутність (і шлях, який пройшов під час атаки).
Не пам'ятайте облікові дані користувачів у файлах cookie, якщо користувач не просить це зробити (прапорець "Запам'ятати мене" повинен бути знятий за замовчуванням, щоб уникнути помилок людини).