Подписывание http-запросов

Есть некое API для мобильных приложений, которое нужно защитить. Хочется подписывать запросы чтобы при обращении к бэкенду отбрасывать неподписанные запросы или запросы от заблокированных клиентов.

Есть ли готовые практики, кейсы для таких задач?

Сейчас вырисовывается следующая схема, но мне в силу особенностей мышления сложно оценить ее достаточность:

Приложение при первом обращении к бэкенду получает api-key. Кроме того, в приложение зашита строка secret, которую знает только клиент и бэкенд и которая не передается между ними.

После получения api-key приложение подписывает каждый запрос строкой, сгенерированной на основе api-key + secret + что-то еще.

sign = hmac-sha1( api-key + secret + md5(request data) )

То есть в запросе передается api-key (по нему идентифицируется устройство/юзер) и sign. Бэкенд, зная sign и secret, может проверить подпись на валидность.

Этого достаточно или полный фуфел? Может, достаточно просто устанавливать соединение по HTTPS и всё?
  • Вопрос задан
  • 6622 просмотра
Пригласить эксперта
Ответы на вопрос 6
stnw
@stnw
Я у себя использовал похожее решение, только добавил еще дату создания:
ApiKey=«iphone_key», Signature=«a048d4fb029cc191874ebb787893e708», Created=«2013-08-28T17:43:09+04:00»
По дате создания можно отсекать устаревшие запросы (например, которые были созданы раньше чем 5 минут назад). Иначе, перехватив запрос его можно использовать хоть через год.
Ну и все важные операции (биллинг, пароли) конечно через https.
Ответ написан
deadkrolik
@deadkrolik
Защиты не существует. Всегда можно взломать apk или ipa и подсмотреть что там к чему. Мы тоже сделали подписывания и https, но это скорее от тех, кто захочет нас раскусить за пять минут. Кому надо — вскроет. Мы к этому готовы.

OAuth тут вообще ни о чем.
Ответ написан
Комментировать
BeLove
@BeLove
security
Соль слева - дело плохо :)
Могу подписать любой запрос, не зная ключа с помощью length extension attack.
Ответ написан
Комментировать
nazarpc
@nazarpc
Open Source enthusiast
Можете почитать стандарт OAuth 2.0 RFC 6749.
Там, к стати, написано, что секрет хранить на клиенте нельзя, он используется для северного взаимодействия.
Ответ написан
Комментировать
KEKSOV
@KEKSOV
Было у меня похожее решение — все AJAX запросы шифровались blowfish при помощи пароля пользователя, который он указывал при логине
Ответ написан
Комментировать
@bondbig
Если нет противопоказаний против HTTPS с взаимной аутентификацией, то это самый правильный вариант.
Когда любители (с точки зрения криптографии) начинают изобретать велосипед — к добру это обычно не приводит.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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