Как написать" истинно " частный метод в C#?
На самом деле, частные методы реализованы в C#, которые все еще можно искать с помощью Reflection
.
public string Encrypt(string data)
и private string Decrypt(string cipher)
для выполнения шифрования и дешифрования.
К сожалению, если кто-то знает .NET framework, он может использовать Reflection
, чтобы найти Decrypt
методы и расшифровать все, что зашифровано.
Похоже, что это не так безопасно. Поэтому я хочу сделать Decrypt
метод действительно частным методом.
Но как это сделать это?
Обновлено 09 янв 2012 10: 52 по сиднейскому времени
Bdares предоставляет техническое объяснение этого вопроса
Эрик Липперт дает политическое объяснение этого вопроса
Спасибо обоим экспертам!
5 ответов:
Если злоумышленник имеет доступ к вашему коду, скомпилированному или исходному, он может отследить вашу программу и найти, где она зашифрована или расшифрована.
Вы можете добавить уровень безопасности, храня ключ в отдельном месте, но обычно, если злоумышленник выполняет код на вашем сервере, вы уже облажались.
(вы беспокоитесь об этом только в том случае, если атакующий выполняет код на вашем сервере, потому что в противном случае не имеет значения, является ли метод частный. Кроме того, он не может использовать отражение для поиска имен методов, если он не выполняет код на вашем сервере. Короче говоря: вы беспокоитесь не о том, что здесь происходит.)
Ваша основная проблема заключается в том, что вы неправильно поняли модель доверия. Если кто-то может использовать отражение, то он является пользователем. Вы являетесь поставщиком программного обеспечения. Вы работаете на них. доверие течетот них , а неот вас . Это человек, который должен доверять Вам, а не вам им.
Если вы не доверяете пользователю, то Не продавайте ему свое программное обеспечение в первую очередь. Не продавайте оружие людям, которые, по вашему мнению, планируют нападение. ты.
Я полагаю, что вы имеете в виду обфускацию, которая представляет собой попытку скрыть/замаскировать код от чтения людьми при открытии в программе, такой как Reflector. В Visual Studio поставляется лицензия на использование сообщества для упреждающих решений dotfuscator, которая обеспечит эту функциональность для небольших проектов, а также для проектов Windows Phone (если вы загрузите дополнение). Есть также коммерческие платформы, доступные тоже от того же поставщика и другие .
Если вы создаете свой собственный метод шифрования, вы делаете это неправильно. Люди, которые знают о шифровании гораздо больше, чем вы или я, уже придумали отличные методы шифрования, и MS уже реализовала большинство из них.
Для хорошего шифрования именно ключи, а не метод делают шифрование безопасным. Храните ключи в безопасности, и алгоритм может (и должен) быть опубликован для всеобщего обозрения.
Если вы пытаетесь распространять и хранить его в зашифрованном виде, ака ДРМ, вы, скорее всего, обречены на неудачу, если вы не можете держать ключи очень хорошо скрытыми в аппаратных средствах, и даже это только выиграет вам некоторое время-может быть, месяцы, может быть, годы.
Я не уверен в вашем точном применении. Но если вы продаете продукт клиенту, который будет выполнять как шифрование, так и дешифрование в своей собственной системе, то нет никакого способа сохранить шифрование в секрете от них. Но вместо этого вы можете позволить им создать новый Закрытый ключ для собственного использования. Таким образом, данные каждого клиента "безопасны" по отношению к другим клиентам; хотя, очевидно, все еще не так безопасны на сайте того же клиента. В других ситуациях, когда вы контролируете зашифрованное содержимое вы также можете посмотреть на создание закрытого мастер-ключа, который будет сгенерирован на вашей стороне и только позволит клиенту иметь открытый ключ.