Как обычно, это зависит от того, какой уровень защиты вам нужен, и сколько вы готовы инвестировать.Поскольку вы не можете использовать сеансы, вам нужен какой-то способ проверки состояния без сохранения состояния.Как правило, это можно сделать двумя способами: каждый раз отправлять учетные данные (например, обычную аутентификацию) или отправлять какой-либо токен (кстати, именно идентификатор сеанса, это токен, который ссылается на сеанс в реальном времени на сервере).
Когда вы генерируете токен, рекомендуется использовать стандартный и проверенный алгоритм вместо того, чтобы изобретать свой собственный и / или полагаться на безвестность.Даже если это выглядит в основном безопасно, это может быть не так.Например, существуют известные атаки против идеи MD5, описанной выше (легко добавить данные в сообщение, не зная ключа, и получить другой действительный MAC). HMAC-SHA1 разработан для того, чтобы их избежать.
Первое, что нужно: если вы можете, do использует SSL для всех запросов.Это позволит выполнить несколько вещей одновременно:
- пользователи (ваше приложение) могут быть уверены, что они публикуют свои данные в нужном месте (т. Е. В вашем веб-приложении).Аутентификация сервера SSL заботится об этом.
- это обеспечит автоматическое шифрование любых опубликованных вами кредитов / токенов.
- Атака воспроизведения становится практически невозможной
Кажется, у вас уже есть аутентифицированные пользователи, поэтому выдача токенов должна быть относительно простой.Возможно, вы захотите подумать о протоколе для реализации, но по мере того, как вы будете рассматривать больше случаев, вы станете ближе к переизобретению OAuth и друзей.Некоторые вещи, которые следует учитывать:
- срок действия токенов: так что даже если кто-то завладеет им, он не сможет использовать его бесконечно.
- способ отзыва токенов
- может иметь разные токены для разных частей (сервисов) веб-приложения, поэтому вы можете предоставить / отозвать доступ только к необходимым сервисам
Чтобы убедиться, что вы (т. Е. Ваше веб-приложение) единственные, кто может выдавать указанные токены, вы должны подписать их ключом, который есть только у вас.Поскольку подписывающее лицо и верификатор одинаковы (вы), вам не нужно использовать криптографию с открытым ключом, HMAC должен это делать.Вы можете, например, объединить имя пользователя, время выдачи и любую другую соответствующую информацию и использовать их в качестве входных данных для HMAC.Упакуйте эти параметры вместе с подписью (вывод HMAC), чтобы создать токен, и приложение будет отправлять его с каждым запросом.Проверьте на сервере и разрешите доступ, если он действителен, потребуйте повторный вход в систему (новый токен), если истек срок действия, иначе запретите доступ.
В качестве альтернативы, если вы хотите аутентифицировать только приложение и не смешивать в нем информацию о пользователе, вы можете использовать аналогичный подход для подписывания запросов на стороне клиента (на стороне приложения).Если вы выберете этот способ, используйте стандартный алгоритм.Это, конечно, потребовало бы наличия в приложении ключа подписи (в той или иной форме), поэтому, если кто-то овладеет им (путем обратного инжиниринга и т. Д.), Он может выдать столько запросов, сколько пожелает.Хотя есть способы смягчить это:
- реализуют логику подписи в собственном коде
- не хранят необработанный ключ, а извлекают его во время выполнения из битов и кусков, хранящихся в разныхмест
И, конечно, самый простой способ - потребовать базовой или дайджест-аутентификации на сервере (конечно, через SSL) и встроить имя пользователя и пароль в приложение (достаточно запутанное).).На стороне сервера, которая потребует только изменения конфигурации сервера, добавлено несколько строк на стороне клиента.Недостатком является то, что на самом деле нет способа изменить эти учетные данные, если они скомпрометированы (если не выпускать новую версию и не блокировать доступ со старой, чтобы заставить людей обновляться; не очень).