Как написать" истинно " частный метод в C#?


На самом деле, частные методы реализованы в C#, которые все еще можно искать с помощью Reflection.

То, что я собираюсь сделать, это написать методы public string Encrypt(string data) и private string Decrypt(string cipher) для выполнения шифрования и дешифрования. К сожалению, если кто-то знает .NET framework, он может использовать Reflection, чтобы найти Decrypt методы и расшифровать все, что зашифровано.

Похоже, что это не так безопасно. Поэтому я хочу сделать Decrypt метод действительно частным методом.

Но как это сделать это?


Обновлено 09 янв 2012 10: 52 по сиднейскому времени

Bdares предоставляет техническое объяснение этого вопроса

Эрик Липперт дает политическое объяснение этого вопроса

Спасибо обоим экспертам!

5 4

5 ответов:

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

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

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

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

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

Я полагаю, что вы имеете в виду обфускацию, которая представляет собой попытку скрыть/замаскировать код от чтения людьми при открытии в программе, такой как Reflector. В Visual Studio поставляется лицензия на использование сообщества для упреждающих решений dotfuscator, которая обеспечит эту функциональность для небольших проектов, а также для проектов Windows Phone (если вы загрузите дополнение). Есть также коммерческие платформы, доступные тоже от того же поставщика и другие .

Этот пост в блоге объясняет немного больше .

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

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

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

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