Защита пароля в исходном коде?

У меня есть пароль в моем коде, который необходим для подключения к SFTP-серверу. Каков наилучший способ "запутать" или скрыть его в коде?

спасибо

10 ответов


Не храните пароль в исходном коде, храните его в защищенном разделе внутри приложения.Config (или Web.Конфигурация.)

посмотреть Шифрование Разделов Файла Конфигурации С Использованием Защищенной Конфигурации в этой Microsoft Doc

Это работает путем шифрования ключей шифрования с помощью встроенного материала Windows, заблокированного на Mac-адрес и различные другие недокументированные вещи.

Это даже будет работать, если вы используете больше чем один сервер:

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

используя это, если кто-то хотел получить ваш пароль, они должны были бы сначала сломать безопасность Windows на вашем сервере (не невозможно, но сложнее, чем смотреть в ваш Иль пароль однозначно).


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

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

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


Я действительно рассматриваю возможность использования функции "защищенные разделы" в приложении.Config или Web.Config должен быть менее безопасным, чем хранение пароля в коде.

любой человек с доступом к серверу может расшифровать этот раздел конфигурации так же быстро, как вы зашифровали его, выполнив команду decrypt, описанную в статье, которую все продолжают цитировать:

aspnet_regiis -pd "connectionStrings" -app "/SampleApplication"

https://msdn.microsoft.com/en-us/library/zhhddkxy.aspx#Anchor_1

Итак, эта функция ASP.Net только добавляет безопасности в том случае, если хакер каким-то образом имел доступ к вашей сети.config, но не весь ваш сервер (произошло в 2010 as @djteller упоминается в комментарии Oracle padding attack). Но если у них есть доступ к серверу, вы выставили в одном cmd звонок. Им даже не нужно устанавливать ildasm.исполняемый.

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

в этом случае хакер должен как минимум декомпилировать ваш код, найти ключ, а затем выяснить, какой алгоритм шифрования вы используете. Не невозможно, но, конечно, сложнее, чем запустить "aspnet_regiis-pd...".

между тем я также ищу лучшие ответы на этот шестилетний вопрос...



нет "лучшего способа" сохранить пароль в исходном коде, так как он может быть восстановлен многими способами.

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


вы можете поместить его как зашифрованное значение в интернете.конфигурационный файл. Это не выглядит слишком сложно: K Скотт Аллен учебник http://odetocode.com/blogs/scott/archive/2006/01/08/encrypting-custom-configuration-sections.aspx

Я думаю, что есть сообщение в блоге Скотта ГУ со ссылками на другую информацию. http://weblogs.asp.net/scottgu/archive/2006/01/09/434893.aspx


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


Не сохраняйте пароль в исходном коде.

читать это: http://en.wikipedia.org/wiki/Security_through_obscurity

нет хорошего способа.

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

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


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

У вас есть другой вариант? Raw SFTP-доступ опасен, возможно, вы можете создать какой-то прокси-службы между ними, которая позволяет только конкретные действия, необходимые вашему приложению. Хранение пароля для этой службы в коде не так рискованно, как хранение пароля SFTP в коде.


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