Защита секретных ключей API в приложении для толстых клиентов - PullRequest
4 голосов
/ 29 августа 2008

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

Является ли запутывание сборки хорошим способом защиты этих ключей?

Ответы [ 4 ]

8 голосов
/ 29 августа 2008

Вероятно, нет.

Посмотрите на криптографию и встроенные в Windows механизмы сокрытия информации (например, DPAPI и хранение ключей в разделе реестра с ограниченным доступом ACL). Это так же хорошо, как вы собираетесь получить для безопасности, вы должны держать в той же системе, что и ваше приложение.

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

1 голос
/ 18 марта 2017

Поздно здесь игра ...

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

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

Если производительность является проблемой, вы можете использовать Диффи-Хеллмана поверх асимметричной PKI, чтобы установить общий секретный симметричный ключ для использования с шифром, таким как AES. «общий» в данном случае означает общий доступ между клиентом и сервером, а не всеми клиентами / пользователями. Нет жестко закодированного / запеченного в ключе. Anywhere.

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

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

Кроме того, сами ключи никогда не передаются по сети. Клиент Алиса и сервер Боб самостоятельно вычисляют их. Те сведения, которые они передают, чтобы сделать это, теоретически могут быть перехвачены Чарли третьей стороной, что позволит ему самостоятельно рассчитать общий секретный ключ. Вот почему вы используете эту (значительно более дорогую) асимметричную PKI для защиты генерации ключей между Алисой и Бобом.

В этих системах генерация ключей довольно часто связана с аутентификацией и, следовательно, созданием сеанса. Вы «входите в систему» ​​и создаете свой «сеанс» через PKI, и после этого клиент и сервер независимо имеют симметричный ключ, который можно использовать для более быстрого на порядок шифрования для всей последующей связи в этом сеансе. Для крупномасштабных серверов важно сэкономить циклы вычислений при расшифровке, используя, скажем, TLS для всего.

Но подождите: мы еще не в безопасности. Мы только запретили читать сообщения.

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

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

Что должно быть очевидно, так это понять, что это нелегко. Таким образом, используйте PKI, если вы АБСОЛЮТНО не можете.

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

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

1 голос
/ 12 сентября 2008

DannySmurf правильно, что вы не можете скрыть ключи от человека, запускающего приложение; если приложение может получить ключи, то может и человек.

Однако, что вы пытаетесь достичь в точности?

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

1 голос
/ 29 августа 2008

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

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

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

У меня возникла идея сделать это для моих приложений, но я никогда не реализовывал это.

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