Как хранить конфиденциальные данные (например, пароли, ключи API) в приложении Какао? - PullRequest
5 голосов
/ 27 октября 2009

Мне нужно предоставить некоторые пароли, ключи API и аналогичные конфиденциальные данные в моем коде. Каковы лучшие практики в этом отношении? Hard-код? SQlite? Какая-то криптографическая структура?

Ответы [ 5 ]

5 голосов
/ 28 октября 2009

Как говорили другие, вы не можете одновременно защитить ключ API и использовать его в своем приложении. Тем не менее, вы можете сделать простое запутывание относительно легко, и если отдача от взломщика низка, то вы можете не обжечься.

Один простой способ - разбить ключ API на несколько подстрок. Убедитесь, что вы поместили их в свой код в произвольном порядке. Например, если ваш ключ API равен 12345678901234567890 , вы можете разбить его на 5 подстрок, например:

static char *part1 = "12345";  
static char *part5 = "7890";    
static char *part3 = "890123";  
static char *part2 = "67";  
static char *part4 = "456";

Если вы запускаете /usr/bin/strings в полученном двоичном файле, вы не должны видеть ключ API по порядку. Вместо этого вы увидите подстроки API в порядке, указанном в вашем C-файле. С 5 подобными подстроками это 5 * 4 * 3 * 2 * 1 = 120 перестановок. Если разбить его на 13 подстрок, вы получите более 6 миллиардов перестановок.

Однако это не остановит тех, кто знает, что они делают, от получения вашего API-ключа, если он этого хочет. В конце концов вам придется объединить строки и передать их одному из ваших методов, после чего взломщик может использовать отладчик для установки точки останова и проверки памяти.

3 голосов
/ 28 октября 2009

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

Существует несколько приемов, которые можно использовать для замедления взломщика: (1) Использовать бессмысленные имена для классов, методов и переменных, чтобы скрыть код, обрабатывающий шифрование, например. - (void) qwert asdf: (NSString *) lkj; (2) Вставьте дубликаты процедур и веток, которые на самом деле ничего не делают. (3) Скрыть данные в неожиданном месте, например, в изображениях.

3 голосов
/ 28 октября 2009

Используйте Mac OS X Keychain:

Обновление:

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

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

2 голосов
/ 29 октября 2009

Чтобы добавить к прямым ответам: все напрасно, если вы не используете безопасный способ передачи, такой как TLS или SSH. Если вы отправляете восстановленный ключ API в виде открытого текста, для кого-то нетрудно использовать что-то вроде Wireshark или tcpdump (или, что несколько сложнее, настраиваемый маршрутизатор) для захвата его после того, как оно покинет ваше приложение.

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

1 голос
/ 28 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...