Как защитить API сервиса платного контента?

Добрый день.
Возник вопрос, касающийся защиты от несанкционированного доступа к контенту, получаемому мобильным приложением через API. Речь идет о платных подписках на медиа-контент (статьи, видео и проч.) в мобильном приложении БЕЗ регистрации (нет учетной записи, авторизации и проч. Только покупки подписки). Понятно, что нужно как минимум завернуть все в https. Понятно, что нужно проверять ID покупки через средства Google InApp Billing.
Да, можно защитить копирование текста из приложения, сохранения картинок и видео, можно даже скриншоты запретить. Но API остаются "голыми". Достаточно посмотреть куда ходит трафффик, с какими ключами и вытянуть все curl'ом. Была мысль зашивать ключ или сертификат в само приложение, но, насколько я понимаю, выковырять его оттуда на рутованном девайсе не составит большого труда.

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

Так как же защитить контент от слива через API?
  • Вопрос задан
  • 1672 просмотра
Пригласить эксперта
Ответы на вопрос 5
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Запомните пожалуйста: клиент в руках врага. Всегда. Исключений нет. Любая защита может быть только на сервере, на клиенте - только видимость.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Шифруйте отдаваемый контент через RSA между сервером и приложением. (SSL/не SSL - это мы сейчас не рассматриваем!)

1. Формируйте УНИКАЛЬНЫЙ! контент/трафик для каждого пользователя и расшифровывайте доставленный контент исключительно в памяти приложения, непосредственно перед моментом отображения на экране!

2. Используйте платёжные данные при шифровании данных на сервере.
3. Меняйте ключ при каждом запросе на основе номера пакета текущей сессии, времени, случайного числа и т.д.
4. Отдавайте контент порциями с разным шифрованием - prefetch/segmentation.
5. Обновляйте протокол внутреннего шифрования хотя бы раз в 1-2 месяца.

Нет 100%-ой защиты на клиенте, которая не позволила бы сохранять контент.
За то - можно это усложнить до нереальных трудозатрат.
Ответ написан
Комментировать
@maxtm
Make money, not job
А разве защиты по ID покупки недостаточно?
curl'ом не получится вытащить больше, чем было куплено.

Если не хотите чтобы купленное можно было вытащить еще как-то, кроме как в самой аппке, попробуйте впилить once-token'ы, генерацию которого будет знать только ваша апка.
Это позволит сделать так, чтобы все запросы были валидными только единожды.
Конечно, остается кейс, когда запрос до сервера "не доходит", а потом исполняется curl'ом, но это уже из разряда паранойи.

Сложность защиты должна быть соизмерима с ценностью защищаемого контента.
Ответ написан
@cicatrix
было бы большой ошибкой думать
Дайте клиенту токен - ничего не значащий guid, пусть его предъявит API, получит следующую порцию контента, смените токен через период N (минута, час, день, неделя).
Ответ написан
samodum
@samodum
Какой вопрос - такой и ответ
Здесь только один способ - экранировать запросы через собственный сервер, откуда уже и отправлять запросы к платному API
Мобильное приложение -> свой сервер -> платный API
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы