Как можно безопасно встроить статическую строку (ключ) в C #? - PullRequest
49 голосов
/ 01 марта 2012

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

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt";

(на самом деле это не ключ;))

Заранее спасибо.

Ответы [ 6 ]

22 голосов
/ 01 марта 2012

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

Выдержка:

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

11 голосов
/ 01 марта 2012

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

Если вам нужно отправить ключ в xap с разумной степенью защиты, то я думаю, что ответ @ makaдает лучшую ставку - обфусцируйте ее как можно лучше - но не думайте, что это сделает вас защищенным - то есть, не делайте этого для приложений мобильного банкинга!

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

5 голосов
/ 01 марта 2012

Вы можете зашифровать ключ Api с помощью ProtectedData , а затем расшифровать его во время выполнения.Это хороший урок, как зашифровать данные в Windows Phone: Шифрование в Mango

0 голосов
/ 01 марта 2012

Возможно, это не ответ, но уверен, что это предложение:

Хранить зашифрованный ключ в БД. И сохраните зашифрованный «пароль БД» в app.config.

  1. Используйте два правильных алгоритма шифрования / дешифрования строк, скажем, алгоритм x и y.
  2. Поместите зашифрованный пароль БД в app.config, прежде чем опубликовать его.
  3. Decypt app.config password (algo y) для подключения БД для получения новой зашифрованной строки (реальной).
  4. Закрыть соединение и расшифровать новую строку с помощью алгоритма x, если рефлектор / и т.д. не работает.
  5. Используйте это.
  6. Удалите объект, содержащий строку.
0 голосов
/ 01 марта 2012

Вы можете использовать DotFuscator , чтобы отключить возможность использования отражателя.Но это не позволит вам изменить ключ без перекомпиляции.

В прошлом я использовал следующий метод в другом программном обеспечении (на основе веб / winform):

http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx

0 голосов
/ 01 марта 2012

Может быть, вы можете зашифровать его заранее и сохранить в app.config. И во время чтения расшифруйте его, используя тот же алгоритм.

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