Лучший способ защитить частный REST API без аутентификации пользователя для мобильного приложения

Я делаю несколько полезных API для моего мобильного приложения.

Связь между APP и веб-сервером должна выполняться в REST. Эти apis должны быть закрытыми, и только мое приложение должно иметь возможность называть их успешными результатами.

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

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

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

Ответы

Ответ 1

Взгляните на механизм кода аутентификации сообщения Hash (Hash).

Ссылка в Википедии: http://en.wikipedia.org/wiki/Hash-based_message_authentication_code

Вашему клиенту (мобильному приложению) потребуется ключ public API, который идентифицирует клиента веб-службы REST и закрытый/ криптографический ключ. Открытый API API можно отправить вместе с HTTP-запросом. Это публично, и все это видят. Частный ключ, однако, никогда не должен отправляться вместе с запросом и должен быть известен только серверу и клиенту. Этот ключ используется для генерации хэшированного сообщения, которое вместо этого будет отправлено на сервер. HMAC может быть сгенерирован с использованием алгоритма SHA1/MD5, сообщения, которое должно генерироваться алгоритмом, который знает как сервер, так и клиент, и, наконец, закрытый ключ.

Ответ 2

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

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

FYI: вышеупомянутая процедура является общепринятым стандартом и называется Digest Authentication. Если вам нужна дополнительная помощь, просто попросите Google "проверить подлинность электронной почты Android"

Ответ 3

Я бы предложил создать сложный токен в приложении, сделанный из timestamp + appId + любое другое значение, которое вы можете реплицировать на сервере, и аутентифицировать в заголовке каждого запроса, используя эти.

Например, вы можете создать виртуального "пользователя" в своем db и сохранить в нем deviceToken и использовать его для своего алгоритма.

Я лично сохраняю один запрос API public, который является метрической меткой времени, которая возвращает метку времени сервера для использования в течение 300 секунд.

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

Захватывающий хакер может перепроектировать приложение и воспроизвести ваши жетоны, хотя