Насколько безопасны данные внутри значений частного поля в классе и как сделать их более безопасными? - PullRequest
2 голосов
/ 29 марта 2011

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

Мне интересно с этого момента , насколько безопасны эти данные - насколько легко они могут быть доступны хакеру, просеивающему память и т. Д. Сценарий perfect здесь только его открытый метод с именем Class.CalculateSomething() сможет получить доступ к этим полям и вернуть результаты.

Зная, что это, вероятно, невозможно, есть ли способ повысить безопасность этих полей, в основном чисел и строк?

Ответы [ 8 ]

8 голосов
/ 29 марта 2011

Вы не включаете самый важный факт об атакующем: кто является атакующим ?Анализ в значительной степени зависит от ответа на этот вопрос.

Если злоумышленник пользователь , то все готово.Вы ничего не можете сделать, если злоумышленник владеет машиной. Они владеют машиной .Вы даже не знаете, работают ли они Windows или не ради бога.Они могли бы написать свою собственную операционную систему и свой собственный CLR.Даже если в CLR была система безопасности, вы не можете полагаться на нее, поскольку злоумышленник может атаковать ваш код из пользовательской среды. Код не может хранить секреты от определенного пользователя.

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

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

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

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

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

3 голосов
/ 29 марта 2011

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

Кроме того, private не всегда ограничивает область доступа; Отражение можно использовать для простого изучения и изменения приватных полей.

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

С целыми числами я бы порекомендовал преобразовать их в строки, сохранить их в SecureString, а затем вытащить их / проанализировать при необходимости.

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

3 голосов
/ 29 марта 2011

Они легко доступны через отражение. Не требуется взлома. Вы пытаетесь реализовать проверку серийного ключа? Лучше всего это сделать в DLL-коде с собственным кодом, который сложнее взломать, потому что вам нужно больше знаний ... Но, тем не менее, это небезопасно, как вы можете видеть с каждым взломанным программным обеспечением ...

2 голосов
/ 29 марта 2011

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

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

2 голосов
/ 29 марта 2011

Я не думаю, что частный используется так, как вы намереваетесь. Он предназначен для выполнения объектно-ориентированной разработки, а не для защиты от кражи данных.

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

1 голос
/ 29 марта 2011

Для защиты строк вы можете использовать Класс SecureString . Также вы можете запутать свой код, но это решение, которое поможет, только если хакеры достаточно ленивы.

0 голосов
/ 29 марта 2011

Не безопасно вообще. Crack.net позволит всем проверять процессы, если у них есть разрешение на компьютере.

0 голосов
/ 29 марта 2011

Это совсем не безопасно.Просеивание памяти покажет ваши данные.Это не то, для чего private.

...