Anonym
@Anonym
Программирую немного )

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

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

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

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

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

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


Подскажите, как организовать авторизацию Клиента на Сервере максимально безопасно в данной ситуации.
  • Вопрос задан
  • 6828 просмотров
Пригласить эксперта
Ответы на вопрос 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 книги Прикладная Криптография, Брюса Шнайера. для вас
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
11 мая 2024, в 00:19
1000 руб./за проект
10 мая 2024, в 23:51
30000 руб./за проект
10 мая 2024, в 23:33
2500 руб./за проект