Защищенные ключи в сценарии приложения iOS, безопасно ли это?

Я пытаюсь скрыть 2 секрета, которые использую в одном из своих приложений.

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

Я думал об этом сценарии -

  • Предварительно задайте секреты в базе данных CoreData моего приложения, распространив их на другие объекты, чтобы скрыть их. (У меня уже есть исходная БД в этом приложении).
  • Когда приложение запускается в первый раз, сгенерируйте и переместите ключи в связку ключей.
  • Удалите записи из CoreData.

Это безопасно или хакер может увидеть, как это происходит, и получить эти ключи?

*ТРЕТЬЕ ИЗМЕНЕНИЕ** Извините, что не объяснил этот сценарий с самого начала - приложение имеет много уровней, каждый уровень содержит файлы (аудио, видео, изображения). Пользователь может приобрести уровень (IAP), и после завершения покупки мне нужно загрузить файлы на его устройство.

Для iOS6 файлы хранятся с новой функцией Apple «Размещенный контент». Для iOS5 файлы хранятся в amazon S3.

Итак, во всем этом процессе у меня есть 2 ключа: 1. IAP-ключ для проверки покупки в Apple IAP. 2. Ключи S3, для получения файлов с S3 для пользователей iOS5:

NSString *secretAccessKey = @"xxxxxxxxx";
NSString *accessKey = @"xxxxxxxxx";

Нужно ли вообще защищать эти ключи? Я боюсь, что люди смогут получить файлы с S3 без покупки уровней. Или что хакеры смогут создать взломанную версию со всеми предварительно загруженными уровнями внутри.


person shannoga    schedule 08.02.2013    source источник
comment
Как используется секрет? Это для связи между клиентом и сервером? Надежно храните файлы на устройстве? Знание причины для защиты чего-либо может помочь предложить наилучший подход к ее достижению.   -  person WDUK    schedule 13.02.2013
comment
Можете ли вы добавить дополнительную информацию о том, ПОЧЕМУ вам нужно защитить эти ключи S3? Я правильно понимаю, что вы хотите, чтобы эти файлы были доступны только пользователям вашего приложения? Вы продаете доступ к этим файлам через IAP и опасаетесь, что люди скачают и начнут использовать их бесплатно?   -  person Victor Ronin    schedule 15.02.2013
comment
Кроме того, от кого вы защищаете? Законный пользователь приложения (купил приложение, оплатил через IAP и теперь пытается взломать приложение) или нелегитимный пользователь (кто-то, кто смог где-то получить .ipa вашего приложения, а теперь пытается взломать ваше приложение и получить ключи из Это). Существует больше способов защиты от незаконных пользователей (по сравнению с законными).   -  person Victor Ronin    schedule 15.02.2013
comment
@VictorRonin Еще раз отредактировал, объяснил сценарий покупки   -  person shannoga    schedule 16.02.2013


Ответы (3)


Позвольте мне попытаться разбить ваш вопрос на несколько подвопросов/предположений:

Предположения:

а) Связка ключей — безопасное место

На самом деле, это не так безопасно. Если ваше приложение установлено на устройстве с джейлбрейком, хакер сможет получить ваши ключи из связки ключей.

Вопросы:

а) Есть ли способ поместить ключ в приложение (двоичный файл, который поставляется из AppStore) и обеспечить полную безопасность?

Краткий ответ НЕТ. Как только в вашем двоичном файле есть что-то, это может быть реконструировано.

b) Поможет ли обфускация?

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

Однако в большинстве случаев безопасность через неизвестность — плохая практика. Она дает вам ощущение, что вы в безопасности, но на самом деле это не так.

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

c) Что мне делать в таком случае?*

Трудно дать вам хорошее решение, не зная предыстории того, что вы пытаетесь сделать.

Например, почему у всех должен быть доступ к одному и тому же Amazon S3? Им нужно только чтение или запись (как указал Кендалл Хелмстеттер Гейн).

Я считаю, что одним из самых безопасных сценариев будет что-то вроде этого:

  • Ваше приложение должно быть защищено паролем
  • Когда вы впервые входите в свое приложение, оно запрашивает у пользователя аутентификацию (введите свое имя пользователя, пароль) на сервере.
  • Это аутентифицирует ваш сервер или другого поставщика аутентификации (например, Google).
  • Сервер отправляет на устройство некоторый токен аутентификации (часто это файл cookie).
  • Вы шифруете этот токен на основе хэша кода доступа вашего приложения и сохраняете его в цепочке для ключей в этой форме.
  • And now you can do one of two things:
    • hand over specific keys from the server to the client (so each client will have their own keys) and encrypt them with the hash of your application passcode
    • обрабатывать все операции с S3 на сервере (и требовать от клиента отправки)

Таким образом, вы защититесь от множества возможных атак.

c) Уууу.... Я не планирую реализовывать все то, что вы только что написали, потому что это займет у меня месяцы. Есть ли что-нибудь проще?

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

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

P.S. И Кендалл, и Роб правы.

Обновление 1 (на основе новой информации)

Прежде всего, видели ли вы в руководстве по программированию покупки приложения.

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

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

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

Это не остановит продвинутого хакера, но, по крайней мере, защитит от любого, кто использует iExplorer и просто копирует файлы (поскольку они будут зашифрованы).

Обновление 2

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

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

person Victor Ronin    schedule 14.02.2013
comment
Что касается обновления 2: вам нужен ключ шифрования, чтобы получить ключ шифрования с сервера. - person Thi; 11.04.2016
comment
Что вы имеете в виду под защитой паролем, вы говорите о пароле, который хранится в двоичном файле, а затем его хэш используется в качестве симметричного ключа для доступа к токенам? или вы говорите о фактическом коде доступа, который конечный пользователь должен будет ввести? - person Þorvaldur Rúnarsson; 23.09.2016
comment
И еще кое-что. Что это за защита? Звучит так, как будто это защита хранения токенов, но это не имеет большого значения, потому что человек в средней атаке раскроет токены, отправляемые приложению. - person Þorvaldur Rúnarsson; 23.09.2016
comment
@ ÞorvaldurRúnarsson Я имел в виду пароль, который вводит конечный пользователь. - person Victor Ronin; 23.09.2016
comment
@ ÞorvaldurRúnarsson Вы абсолютно правы. На взломанных устройствах можно было перехватить все (введенный пароль, расшифрованный токен и так далее). Итак, абсолютно безопасного метода НЕТ. Однако то, что я описал, займет больше времени, чем извлечение жестко запрограммированного ключа из бинарника. Вопрос в том, насколько ценны данные. - person Victor Ronin; 23.09.2016

НЕ храните ключ S3, используемый для записи в вашем приложении! В скором времени кто-то, кто сниффит трафик, увидит вызов записи на S3, еще короче он найдет этот ключ и сделает все, что захочет.

ЕДИНСТВЕННЫЙ способ, которым приложение может записывать контент в S3 с какой-либо степенью безопасности, — это пройти через сервер, которым вы управляете.

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

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

Редактировать:

Основываясь на новой информации, вам, вероятно, лучше просто встроить секреты в код. Используя такой инструмент, как iExplorer, случайный пользователь может легко получить доступ к основной базе данных данных или чему-либо еще в комплекте вашего приложения, но объектные файлы несколько зашифрованы. Если у них есть взломанное устройство, они могут легко получить незашифрованные версии, но по-прежнему может быть трудно найти значимые строки, возможно, сохранить их в двух частях и повторно собрать в коде.

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

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

person Kendall Helmstetter Gelner    schedule 13.02.2013

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

Это не пустая трата времени, чтобы немного запутать. Это нормально. Но не тратьте на это много времени. Если он есть в программе и очень ценен, то он будет взломан. Сосредоточьтесь на том, как обнаружить, когда это произойдет, и как восстановиться, когда это произойдет. И, насколько это возможно, переместите такие конфиденциальные данные на какой-нибудь другой сервер, который вы контролируете.

person Rob Napier    schedule 13.02.2013