Защита In-App Purchase для Android совершенна, почему работает Freedom?
Здравствуйте,
Хочу добавить внутриигровые покупки в Android приложение. Почитал документацию. Я вижу что схема, которую использует Google криптографически стойкая. Ответ подписывается закрытым ключом приложения на сервере гугла, что гарантирует что ни кто не может по середине изменить или подделать ответ сервера. Также в запросе мы можем передавать случайную строку и проверять ее в ответе, это гарантирует что нам не подсовывают какой либо прошлый(другой) валидный ответ сервера.
Т.е. чтобы следовать схеме нам достаточно генерировать случайную строку и проверять ее в ответе и проверять подпись ответа своим открытым ключом и все это делать достаточно в самой apk.
Но я вижу что весь интернет забит проблемами взлома внутриигровых покупок. Люди легко ломают их с помощью Freedom или чего то подобного, хотя эта схема на сколько я понял была всегда такой. Многие пытаются защититься и создают специально сервер, чтобы делать проверку покупок на нем. Хотя если разработчики боятся что apk взломают и обойдут в ней проверку подписи или изменят открытый ключ, то с таким же успехом в ней могут и поменять все общение с игровым сервером. В том или ином случаи, тут нужна какая либо обфускация, чтобы сделать это просто трудным.
Вопросы:
1) Собственно вопрос, почему работает Freedom, большинство разработчики просто забивают на элементарную проверку подписи?
2) Почему люди городят дополнительно сервер, который только и проверяет валидность покупок?
3) Может я что то упускаю и проверка подписи в apk не достаточно?
Update: При более внимательном просмотре, я увидел, что Google все таки не использует стандартную схему маркер + подпись для всех запросов. Freedom конечно работать не будет если проверять подпись, но из-за того что Google привязал developerPayload и подпись к конкретной покупке, а не к запросу, открывается куча вариантов для атаки человек по середине для запросов: получения списка всех покупок, который совершается на старте приложения и потребления покупок. Почему Google сделал такую "не правильную" схему для меня остается загадкой :(
1) Старые версии платежки пока еще работают и они легче подвержены взлому
2) По мануалу гугла подпись проверять не обязательно - вот и не проверяют все.
3) Про дополнительный сервер написано в мануале гугла.
Спасибо за ответ. 1) Я посмотрел также и старую версию биллинга гугла, там также использует подпись в ответе. Не понимаю почему она легче подвержена взлому? 2) В мануале там прям выделенный notes, что рекомендуется проверять подпись. Если люди ее это игнорируют и не проверяют, почему тогда в инете столько вопросов как защитить внутри игровые покупки? 3) Там написано проверяйте в apk, но если у вас игра использует какой то свой сервер, то проверяйте лучше там, что собственно и логично. 4) Из Вашего ответа я так понял что все таки просто разработчики пренебрегают проверкой, а не как в новостях пишут, что гугл взломали. И чтобы мне избежать с Freedom, достаточно просто придерживать схемы заложенной гуглом.
Да, придерживайтесь гугла +проверка подписи +валидатор на сервере. От относительно простых ломалок это спасет. Но никто не исключает всякие ArtMoney, снифферов и взлома самого апк.
Спасибо за Ваше мнение. Я думаю все таки достаточно проверки подписи в apk для защиты внутри игровых покупок. Снифферы не помогут во взломе. ArtMoney и взлом самого апк это все таки общая проблема любых приложений, а не проблема внутри игровых покупок. Т.е. если все разработчики будут следовать правилам, то freedom просто станет не актуальным.
Мы используем и серверную валидацию и свои проверки, но от взлома это все равно не спасает.
Не подумайте что бережем копейки, просто игра сетевая и очень важно не уничтожить всю экономику читерами.
Спасибо за ответ. Хм, это интересно. Вы делаете проверку подписи ответа покупки в апк? Или Вы просто проверяете ее через свой сервер? У Вас есть какое то подтверждение, что обходится как то именно процесс покупки, а не изменяют просто apk или какие либо файлы либо трафик от Вашего сервера и т.д.? Буду, очень благодарен, если Вы ответите на вопросы.
Делали проверку подписи через openssl, но результат валидации был странный, поэтому сверху начали городить костыли - например, внешний вид purchaseToken и orderId. Когда purchaseToken и orderId фридома стало не отличить от настоящего - сделали проверку подписи внутри игры и кажется оно работает нормально. Могу предположить, что у нас на сервере openssl работает как-то косячно, поэтому и мучились так долго)
Спасибо. Если не затруднит отпишитесь потом пожалуйста :) Пока что я все больше убеждаюсь, что freedom работает, только из-за того что разработчики просто не делают почему то проверку подписи ответа.