Как написать «по-настоящему» закрытый метод в C #? - PullRequest
4 голосов
/ 09 января 2012

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

. Я собираюсь написать public string Encrypt(string data) и private string Decrypt(string cipher) методы для выполнения шифрования и дешифрования..

К сожалению, если кто-то знает .NET Framework, он может использовать Reflection для поиска Decrypt методов и расшифровывать все, что зашифровано.

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

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


Обновлено 09 января 2012 г. 22:52 Сиднейское время

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

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

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

Ответы [ 5 ]

16 голосов
/ 09 января 2012

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

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

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

15 голосов
/ 09 января 2012

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

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

2 голосов
/ 09 января 2012

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

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

1 голос
/ 09 января 2012

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

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

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

0 голосов
/ 12 января 2012

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

...