Подтвердить что ты не робот

Как я могу безопасно вставить статическую строку (ключ) в С#?

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

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt";

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

Спасибо заранее.

4b9b3361

Ответ 1

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

Выдержки:

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

Это не ответ, может быть, но обязательно это предложение:

Сохранить ключ с сохранением в db. И храните зашифрованный "пароль db" в app.config.

  • Используйте два правильных строковых алгоритма шифрования/дешифрования, скажем, алгоритм x и y.
  • Поместите зашифрованный пароль db в app.config, прежде чем публиковать его.
  • Десятичный пароль app.config(algo y) для подключения db для ввода новой строки encrpyted (real one).
  • Закройте соединение и деципируйте новую строку с помощью алгоритма x, если отражатель /etc. не работает.
  • Используйте его.
  • Утилизируйте объект, содержащий строку.