Как сохранить секретный ключ API в двоичном файле приложения?

Я создаю клиент Twitter для Mac OS X, и у меня есть секрет потребителя. Насколько я понимаю, я не должен делиться этим секретным ключом. Проблема в том, что когда я помещаю его как строковый литерал в свое приложение и использую его, вот так:

#define QQTwitterConsumerSecret @"MYSECRETYOUMAYNOTKNOW"

[[QQTwitterEngine alloc] initWithConsumerKey:QQTwitterConsumerKey consumerSecret:QQTwitterConsumerSecret];

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

Есть ли безопасный способ хранения секрета потребителя? Должен ли я зашифровать его?


person Community    schedule 02.04.2011    source источник
comment
Если вы зашифруете его, вам все равно придется скрывать ключ шифрования.   -  person Null Set    schedule 02.04.2011
comment
@Null Установить, что если хакер не знает алгоритм шифрования?   -  person    schedule 02.04.2011
comment
Если ключ не относится к какой-то привилегированной учетной записи, нет причин хранить его в секрете или даже для его существования, а Твиттер просто ведет себя глупо. Если он относится к привилегированной учетной записи, то он не принадлежит совместно используемому приложению.   -  person R.. GitHub STOP HELPING ICE    schedule 02.04.2011
comment
@Radek Pro-Grammer: почему ты помечаешь это C? этот фрагмент кода objective-c.   -  person Mat    schedule 02.04.2011
comment
@Mat да, но я не хочу, чтобы этот вопрос относился к какому-либо языку. Я удалю тег C.   -  person    schedule 03.04.2011
comment
@Radek в криптографии всегда лучше предполагать, что противник полностью знает используемый метод шифрования, и обойти это.   -  person Null Set    schedule 03.04.2011


Ответы (4)


На самом деле идеального решения не существует. Что бы вы ни делали, кто-то, преданный этому делу, сможет это украсть.

Даже Twitter для iPhone/iPad/Android/mac/и т. д. там есть секретный ключ, они, вероятно, просто как-то скрыли его.

Например, вы можете разбить его на разные файлы или строки и т. д.

Примечание. Используя шестнадцатеричный редактор, вы можете читать строки ascii в двоичном формате, что является самым простым способом. Разбивая его на разные части или используя вызовы функций для создания секретного ключа, этот процесс обычно усложняется.

person Graham Christensen    schedule 02.04.2011
comment
Стоит отметить, что именно поэтому можно отзывать ключи доступа к API. Если он будет украден (и это проблема), просто отзовите ключ и отправьте обновленное приложение с новым ключом своим пользователям. - person Daniel Dickison; 06.04.2011
comment
@DanielDickison также стоит отметить, что продвижение новой версии мобильного приложения требует времени, особенно с Apple. - person noamtm; 05.02.2015

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

char key[100];
++key[0]; ... ; ++key[0]; // increment as many times as necessary to get the ascii code of the first character
// ... and so on, you get the idea.

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

person Community    schedule 02.04.2011
comment
В этом случае самая безопасная хэш-функция: int hash(char *s) { return 0; } - person R.. GitHub STOP HELPING ICE; 03.04.2011
comment
Это также худший, потому что он всегда приводит к столкновению - person ; 03.04.2011
comment
Моя точка зрения заключалась в том, что хэш с потерями/необратимый бесполезен для хранения ключа, который вам нужно передать в качестве токена аутентификации (в отличие от простого использования его для аутентификации других, кто знает секрет). - person R.. GitHub STOP HELPING ICE; 03.04.2011

Вы не должны использовать секретный ключ API в приложении, которое не работает исключительно на вашем сервере.

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

person ThiefMaster    schedule 02.04.2011
comment
Тогда будет невозможно создать десктопный твиттер-клиент :O - person ; 02.04.2011
comment
@Radek Нет, если у вас есть настольный клиент, подключенный к вашему серверу. - person Null Set; 03.04.2011
comment
@Null Set: отличное замечание. Теперь, когда я думаю об этом, Twitter почти наверняка хочет, чтобы вы делали это. Конечно, это заставляет ваше приложение нарушать конфиденциальность пользователей (передавая их данные через ваш сервер) и прекращать работу, если ваш сервер когда-либо отключается, и поэтому это ужасный дизайн... - person R.. GitHub STOP HELPING ICE; 03.04.2011
comment
В самом общем случае ваш сервер захочет предоставлять все услуги, которые делает исходный сервер (Twitter). И теперь вам нужно аутентифицировать клиентское приложение на вашем сервере. Что приводит к той же самой проблеме, с которой мы начали. - person Daniel Dickison; 06.04.2011
comment
На самом деле вам просто нужно делать то, что вы не должны делать. - person superarts.org; 05.07.2012
comment
@ user142019 Вы всегда можете открыть веб-просмотр со своего веб-сайта в своем приложении. Это обеспечит вашу безопасность, а также подготовит функциональность. Если вы не храните данные на сервере, это может не сработать. - person dinwal; 22.12.2017

Очень поздний ответ...

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

Вы можете использовать этот подход:

Когда пользователь устанавливает ваше настольное приложение, он должен зарегистрировать его в Твиттере и на вашем сервере *) *) Приложение запрашивает сервер сгенерировать URL-адрес запроса токена *) Сервер отправляет сгенерированный URL-адрес в приложение *) Приложение направляет пользователя на URL-адрес авторизации *) Пользователь авторизует ваше приложение в твиттере и вставляет в него сгенерированный PIN-код *) Используя PIN-код, ваше приложение получает токен *) Все дальнейшие коммуникации используют токен и не задействуют ваш сервер

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

person hawk78    schedule 28.02.2016