Как предотвратить компрометацию квитанции о покупке в приложении?

После успешной покупки я сохраняю квитанцию ​​+ идентификатор транзакции в NSUserDefaults. Та же информация отправляется на сервер для ведения учета.

Позже (по запросу), когда пользователь захочет загрузить контент с моего собственного сервера, мое приложение отправит на сервер квитанцию ​​+ идентификатор транзакции. Он найдет сохраненную квитанцию ​​по идентификатору транзакции, отправленную из приложения, и проверит как сохраненные, так и новые квитанции в Apple. Если некоторые ключи совпадают, предоставьте загружаемый контент.

Однако в настоящее время достать NSUserDefaults и извлечь квитанцию ​​+ идентификатор транзакции несложно. Даже если я помещу информацию в связку ключей, можно получить квитанцию ​​из интернет-соединения.

Теперь, если у кого-то будет квитанция + идентификатор транзакции, он сможет отправить запрос на мой сервер и получить контент с любого ПК. Как я могу исправить эту логику без использования криптографии?


person Pablo    schedule 20.02.2014    source источник
comment
Вы можете исправить эту логику, чтобы ее было труднее обойти, но вы не сможете сделать ее пуленепробиваемой без использования криптографии. Поместите информацию в связку ключей (она предназначена для хранения такой конфиденциальной информации) и используйте https для связи с сервером, чтобы защитить транспортировку ваших ключей. Это вся криптография, которая вам нужна - на этом этапе, вероятно, будет дешевле купить ваш контент, чем сломать вашу защиту.   -  person Sergey Kalinichenko    schedule 20.02.2014
comment
Сам механизм проверки квитанции с использованием идентификатора транзакции, который я описал, имеет смысл или я слишком усложняю его?   -  person Pablo    schedule 20.02.2014
comment
Ваша схема проверки не выглядит неприемлемой, если вы защищаете ключи на устройстве и на пути к вашему серверу.   -  person Sergey Kalinichenko    schedule 20.02.2014
comment
Вы можете скопировать это как ответ, если считаете, что это единственный способ, и если нет лучших ответов, я приму его. Благодарю.   -  person Pablo    schedule 20.02.2014


Ответы (1)


Хотя вы можете исправить свою логику, чтобы ее было труднее взломать, если вам нужна реальная защита, вам понадобится какая-то криптография. Вам не нужно применять его явно - что-то столь же распространенное, как переключение с HTTP на HTTPS, часто подойдет. Хитрость.

Три места, где вам нужно защитить ваши конфиденциальные данные, - это устройство, сервер и транзит.

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

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

Остается только защита ваших данных при передаче между устройством и сервером, а также между вашим сервером и сервером Apple. Вы можете использовать HTTPS для обеспечения защиты на транспортном уровне.

Обратите внимание, что добавление всех этих уровней защиты не делает ваши данные абсолютно безопасными: объект, у которого много времени и ресурсов (например, правительство недружественной страны), потенциально может обнаружить ваши ключи - например, путем разборки физического устройства и проверка данных, поступающих из ЦП, с помощью логического анализатора. Однако цель этого упражнения не в достижении абсолютной защиты, а в том, чтобы сделать взлом вашей схемы безопасности непомерно дорогим. С этой целью комбинация Keychain и HTTPS должна привести к тому, что взлом вашей защиты станет дороже, чем покупка вашего контента на законных основаниях.

person Sergey Kalinichenko    schedule 20.02.2014
comment
Часть схемы, которая должна сохранять получение на устройстве, возможно, с использованием связки ключей, верна только для iOS 6.1 или более ранней версии, верно? Потому что из того, что я прочитал, можно расшифровать квитанцию ​​приложения iOS7 и найти там покупку в приложении. Так что он все равно сохраняется в квитанции приложения. Имеет ли это смысл? - person Pablo; 21.02.2014
comment
@Pablo Я не могу найти никакой информации об уязвимости получения приложения iOS7. У вас есть ссылка? Я нашел много ссылок на уязвимость до iOS 6, но она не повлияет на вас, потому что вы проверяете на своем собственном сервере. - person Sergey Kalinichenko; 21.02.2014
comment
Нет, это не уязвимо, и я не видел, чтобы квитанция приложения когда-либо была взломана. Мой вопрос был скорее для схемы проверки. Только для iOS7 я могу пропустить часть сохраняющейся квитанции + TransactionID и взять их из квитанции приложения, а затем отправить их на свой сервер. TransactionReceipt в любом случае устарело в iOS7 ... - person Pablo; 21.02.2014
comment
@Pablo Это правда, схема проверки в iOS 7 изменилась, поэтому вам не нужно хранить квитанцию ​​о транзакции. Это позволяет вам выполнять проверку полностью на устройстве, если вы хотите, не обращаясь к вашему серверу. - person Sergey Kalinichenko; 21.02.2014
comment
О, эта целиком поставила мою схему под большой вопрос. Я, конечно, могу подтвердить получение приложения на iOS7, но в конце дня мне нужно отправить элементы проверки на сервер, чтобы иметь возможность загружать контент. Я не уверен, можно ли извлечь полезную нагрузку для покупки в приложении iOS7 и отправить ее обратно в Apple (через мой сервер) для проверки. Схема iOS7 меня совершенно озадачила ... - person Pablo; 21.02.2014