Подтвердить что ты не робот

Рекомендации PHP для аутентификации пользователей и безопасности паролей

Каковы лучшие текущие библиотеки/методы для аутентификации пользователей без использования CMS или тяжелой структуры?

Ответы должны включать предложения для всего, что, по вашему мнению, следует считать стандартом для новой разработки PHP, включающей аутентификацию пользователя.

4b9b3361

Ответ 1

OpenID - это метод аутентификации пользователей на основе существующих учетных записей на общих веб-сервисах, таких как Yahoo, Google и Flickr.

Вход на ваш сайт основан на успешном входе в систему на удаленном сайте.

Вам не нужно хранить конфиденциальную информацию пользователя или использовать SSL для защиты входа пользователя.

Текущую версию библиотеки PHP можно найти здесь.

Ответ 2

Я использую OpenID.

Но, как stackoverflow, я использую проект Google openid-selector, чтобы сделать тяжелый подъем.
Демо-страница здесь.

Очевидными преимуществами (OpenID) являются.

  • Вам не обязательно быть экспертом по безопасности.
  • Пользователи доверяют большие сайты своей информацией.
  • Вы можете запросить такие вещи, как (псевдоним и т.д.), но пользователь должен выбрать.
  • Вам не нужно беспокоиться:
    • процессы регистрации
    • потерянный/забытый пароль

Ответ 3

Внедрение аутентификации пользователя безопасно, не полагаясь на структуру (или стороннюю библиотеку, такую ​​как OpenID), чтобы сделать это для вас а не тривиальное начинание.

При обзоре 10000 футов вам нужно решить:

  • У вас есть имена пользователей, адреса электронной почты или идентификаторы пользователей в качестве первичного селектора?
  • Как хранить пароли? PROTIP: password_hash() или scrypt - это путь.
  • Как вы должны обрабатывать флажки "помнить меня"? В Интернете существует много плохих стратегий. Относитесь к каждому из них скептически, потому что они могут вводить уязвимости в ваше приложение.
  • Как приложение должно обрабатывать пользователей, которые забыли свой пароль?

Информация, содержащаяся в этом ответе, актуальна и актуальна по состоянию на 9 мая 2015 года и может быть устарела после заключения хеширования пароля

Первичные селектора

В общем, имена пользователей и адреса электронной почты лучше, чем идентификационные номера.

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

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

Хеширование паролей

Вы должны использовать password_hash() и password_verify(), если вы недостаточно опытны в написании криптографических библиотек, чтобы идти вверх и далее.

Beyond Bcrypt

Иногда разработчикам нравится создавать креатив (например, добавлять "перец", что обычно означает предварительное хеширование или HMACing пароли со статическим ключом) и выходит за рамки стандартных реализаций. Мы сами это сделали, но очень консервативно.

Для наших внутренних проектов (которые имеют гораздо более высокий уровень безопасности, чем большинство блогов пользователей), мы написали оболочку вокруг этого API под названием PasswordLock, которая сначала хэширует пароль с sha256, тогда base64 кодирует исходный хеш-вывод, затем передает этот хэш хэш-кода base64 в password_hash() и, наконец, шифрует хэш-код bcrypt с правильно реализованной библиотекой шифрования.

Чтобы повторить, вместо перца, мы шифруем хэши паролей. Это дает нам большую гибкость в случае утечки (мы можем расшифровать, а затем снова зашифровать, потому что мы знаем ключ). Кроме того, мы можем запускать наш веб-сервер и базу данных на отдельном оборудовании в одном центре данных, чтобы уменьшить влияние уязвимости SQL-инъекции. (Чтобы начать хеширование трещин, вам нужен ключ AES. Вы не можете получить его из базы данных, даже если вы бежите в файловую систему.)

// Storage:
$stored = \ParagonIE\PasswordLock\PasswordLock::hashAndEncrypt($password, $aesKey);

// Verification:
if (\ParagonIE\PasswordLock\PasswordLock::decryptAndVerify($password, $stored, $aesKey)) {
    // Authenticated!
}

Хранилище паролей с PasswordLock:

  • hash('sha256', $password, true);
  • base64_encode($step1);
  • password_hash($step2, PASSWORD_DEFAULT);
  • Crypto::encrypt($step3, $secretKey);

Проверка пароля с помощью PasswordLock:

  • Crypto::decrypt($ciphertext, $secretKey);
  • hash('sha256', $password, true);
  • base64_encode($step2);
  • password_verify($step3, $step1);

Дополнительная литература

Ответ 4

Здесь много замечательных ответов, но я чувствую, что стоит сказать это - НЕ пытайтесь изобрести колесо в этом случае! Очень легко повредить аутентификацию пользователя различными способами. Если вы действительно нуждаетесь в специальном решении и имеете фирменное знание схем и лучших практик безопасности, у вас почти наверняка будут недостатки безопасности.

OpenID отлично, или если вы собираетесь сворачивать самостоятельно, по крайней мере, используйте созданную библиотеку и следуйте документации!

Ответ 5

PHPass - это облегченная библиотека переменных хэширования с переменной стоимостью, использующая bcrypt.

Переменная стоимость означает, что вы можете впоследствии увеличить "стоимость" хеширующих паролей для беспрепятственного повышения безопасности без необходимости аннулировать ваши ранее хэшированные пароли пользователей.

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

Ответ 6

Войти с использованием HTTP AUTH

После аутентификации для PHP вам просто нужно использовать $_SERVER['PHP_AUTH_USER'] для получения имени пользователя, используемого во время аутентификации.

Это может быть более быстрое, а иногда и более гибкое решение, чем обработка решения на уровне сценариев при условии, что для пользователя требуется ограниченная информация, поскольку все, что доступно вам, - это имя пользователя, используемое для входа в систему.

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

Перемещение собственного HTTP-AUTH на языке скриптов

Фактически вы можете расширить HTTP Basic Auth, эмулируя его на своем языке сценариев. Единственным требованием для этого является то, что ваш язык сценариев должен иметь возможность отправлять HTTP-заголовки HTTP-клиенту. Подробное объяснение того, как выполнить это с помощью PHP, можно найти здесь: (подробнее о PHP и HTTP AUTH).

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

Недостатки HTTP AUTH

  • Основной недостаток HTTP-аутентификации - это осложнения, которые могут возникнуть при входе в систему. Основной способ очистить сеанс пользователя - закрыть браузер или передать заголовок с 403 аутентификацией. К сожалению, это означает, что всплывающее сообщение HTTP AUTH возвращается на страницу, а затем требует, чтобы пользователи либо вошли в систему, либо удалили отмену. Это может не сработать при учете удобства использования, но может быть использовано с некоторыми интересными результатами (т.е. С использованием комбинации файлов cookie и HTTP AUTH для хранения состояния).

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

  • Базовый auth также означает, что auth_user и пароль отображаются в журналах сервера, а затем вы должны использовать https для всего, потому что иначе имя пользователя и пароль также передаются по сети при каждом запросе в виде обычного текста.

    /li >

Ответ 7

Важно отделить уровень безопасности вашего приложения от остальной части. Если между вашей логикой приложения и вашей системой связи нет расстояния, вы можете свободно общаться в одном месте и безопасно где-то в другом месте. Возможно, вы совершите ошибку и отправьте пароль в незашифрованном файле cookie, или, может быть, вы забудете подтвердить учетные данные пользователя за один шаг. Без "правильного пути" для общения с пользователем вы обязательно сделаете ошибку.

Например, скажем, теперь вы проверяете пользователей:

user_cookie = getSecureCookie()
if (user_cookie.password == session_user.password) {
    do_secure_thing()
    ...
}

Если в getSecureCookie() обнаружена уязвимость, и вы используете этот код для проверки пользователей во всем приложении, вы можете не найти все экземпляры getSecureCookie(), которые необходимо устранить. Если, однако, вы отделите свою логику от своей безопасности:

if (userVerified()) {
    do_secure_thing()
    ...
}

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

Ответ 8

Лучшая проверка подлинности - это использование многофакторной аутентификации, в идеале - без токенов - версии во всех защищенных конфиденциальных входах.

Защита паролем и более простая в использовании с высокой надежностью и безопасностью. Есть несколько доступных за пределами EMC/RSA. Я предпочитаю SwivelSecure PINSafe.

Игорь S