2012-01-09 3 views
4

Фактически, частные методы реализованы на C#, которые все еще можно найти с помощью Reflection.Как написать «по-настоящему» частный метод в C#?

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

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

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

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


Обновлено 09 янв 2012 10:52 PM Sydney Время

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

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

Спасибо и expe ртс!

ответ

16

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

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

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

+2

Хорошие очки. Вы также можете сказать, что 'private' не является концепцией безопасности. Я думаю, это распространенное заблуждение. –

+0

Я согласен с вашими точками. Вы решили мой вопрос ** технический **. Другой вопрос: означает ли это, что есть ** NO ** действительно безопасная программа, которую мы можем сделать, если пользователь получил двоичную программу? –

+2

@AlexYeung: «действительно безопасно» ** против какой угрозы **? Вы можете сделать действительно безопасные программы; вы делаете это, когда * стоимость * для злоумышленника из них, делающего добро на их * угрозу * выше, чем * выгода *, которую они достигают благодаря успешной атаке. Опишите угрозу и преимущества успешной атаки, и только тогда вы можете создать систему безопасности в качестве ответа. –

2

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

This blog post explains a little more.

+0

Вы можете добавить некоторую информацию о том, что обфускация делает по отношению к вопросу. И что это не делает. Обычно это только изменяет имя, чтобы метод был трудно обнаружить. –

1

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

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

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

15

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

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

+0

Достаточно честный, но тогда почему многие компании подходят, чтобы попытаться скрыть свои механизмы лицензирования/шифрования/копирования? Пользователи не заслуживают доверия - вы даете им то, что они сломают и злоупотребляют им. Не все, но немало – ChrisWue

+0

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

+0

Большое спасибо. Я также хочу отметить ответ в качестве ответа, но только один ответ возможен в stackoverflow. Потому что ваш ответ определенно помогает мне отвечать на вопросы моего клиента. –

0

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