Безопасный способ сохранения ключей шифрования в iOS

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

Мой вопрос заключается в том, как хранить эти секретные ключи? Безопасно ли жестко закодировать их с помощью NSString ? Или

 #define SecretKeyString @"febd9a24d8b65c1c787d50a4ed3619a9" 

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

Спасибо за любое предложение …

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

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

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

Тем не менее, песочница iOS от IOS – это ваша первая и самая эффективная форма безопасности.

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

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

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

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

Здесь необходимо прочитать для тех, кто нуждается в написании безопасного кода: http://www.amazon.com/gp/aw/d/0735617228

Interesting Posts
Давайте будем гением компьютера.