Задать вопрос
Anonym
@Anonym
Программирую немного )

Как реализовать авторизацию клиентского приложения?

Есть два веб-приложения, назову для ясности как Клиент и Сервер.
Клиент запрашивает у Сервера данные, Сервер ему отвечает. Запрос методом POST (или GET) по известному URL, ответ в виде JSON. SSL не используется.

Авторизация Клиента на Сервере происходит по ключу. Клиент отправляет ключ, Сервер его проверяет и обрабатывает (или не обрабатывает) данные.

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

Проверка Сервером IP Клиента несколько снижает риск, однако это не панацея.

Исходный код и Клиента и Сервера будет открыт, поэтому злоумышленник наверняка знает как ключ генерируется и как проверяется.


Подскажите, как организовать авторизацию Клиента на Сервере максимально безопасно в данной ситуации.
  • Вопрос задан
  • 6833 просмотра
Подписаться 9 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
Если злоумышленник может получить доступ к ключу текущей версии в любой момент времени и имеет доступ к способу генерации и проверки — тяжело что-то придумать.

Если же нет, то первое, что приходит в голову, это постоянно изменяющийся идентификатор для каждой пары «вопрос-ответ», который клиент получает у сервера при каждом ответе, а следующим запросом подписывает секретом и возвращает серверу. Если сервер решает, что ключ валидный, он обрабатывает запрос и всё начинается заново.
Ответ написан
shanker
@shanker
Если исходники открыты, то единственный вариант — асимметричное шифрование с публичными ключами.
Клиент и сервер обмениваются публичными ключами, секретные оставляют у себя.

Реализаций много. Одна из возможных:

1. Клиент соединяется с сервером, предоставляет ему свой публичный ключ
2. сервер посылает клиенту вопрос, подписанный публичным ключом клиента
3. клиент используя свой закрытый ключ выясняет вопрос сервера, решает вопрос и подписывает его публичным ключом сервера, передаёт серверу
4. сервер применяет к ответу свой секретный ключ, тем самым снимая шифрование, и проверяет ответ. если всё ок — сервер считает, что клиент подтверждён.

возможно то же самое, но в другую сторону для того, чтоб клиент проверил Сервер
Ответ написан
  1. Используйте RSA
  2. Храните ключ на клиенте в зашифрованном на основе логина и пароля виде.
  3. Для авторизации используйте механизм электронной подписи:
    • Сервер отправляет случайно сгенерированную строку, типа $sKey = md5(rand())
    • Клиент тоже генерит случайную строку по тому же типу $cKey = md5(rand())
    • Склеиваем строки и подписываем их хэш с помощью закрытого ключа RSA (на JS реализаций полно) типа sign(sha256($sKey+$cKey))
    • Отправляем на сервер подпись и сгенерированную на клиенте строку
    • На сервере проверяем подпись с помощью открытого ключа


Или используйте Рутокен Web, но это его работы нужно плагин устанавливать.
Ответ написан
Anonym, тогда каждому запросу надо присваивать уникальный номер и дважды его не отрабатывать.
Клиент говорит Серверу я хочу удалить данные, Сервер сохраняет запрос и отправляем Клиент ID запроса. Клиент пересылает это ID Серверу. Сервер удаляем данные и записывает ID. Если злоумышленник передает этот запрос еще раз, то Сервер проверив этот ID ничего не сделает т.к. уже выполнил этот запрос.
Как-то так… других вариантов пока не вижу.
Ответ написан
Комментировать
@1nd1go
Для защиты от Man-in-the-middle attack вам поможет шифрование транспорта или сообщений.
Т.е. вы либо шифруете уровень передачи данных, а значит используете SSL, либо сообщения на уровне приложения. В эпоху фреймворков проще делать через SSL.

А вообще, первая глава и вторая глава, пункт 2.2 книги Прикладная Криптография, Брюса Шнайера. для вас
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы