Расшифрованные значения C# и свойства открытого классаВ чем заключается риск?

(Если это дубликат сообщения, пожалуйста, укажите мне на оригинал или скажите, что искать. Я ничего не смог найти. Спасибо!)

Итак, у меня есть зашифрованное значение, сохраненное в строке базы данных. Я хочу получить значения столбца для строки базы данных и сохранить их в экземпляре класса. Безопасно ли создавать общедоступное свойство класса для расшифрованного значения?

public class *DataRow*
{
    public string *DataElement* { get; set; }
    public string *Value_Decrypted* { get; set; }
}

Может ли внешний процесс как-то получить доступ к публичному свойству? Нужно ли использовать SecureString (или что-то еще) для защиты от взломов памяти? Помогает ли защита данных .NET в этом?

Есть ли где-нибудь практическое руководство/пошаговое руководство о том, как с этим справиться (надеюсь, без особых затрат на кодирование)?

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

Как всегда, любое направление будет высоко оценено.

Благодарю вас!


РЕДАКТИРОВАТЬ:

Спасибо всем за ответы. Пароль был ПЛОХИМ примером - я понимаю, что это не рекомендуется и обычно не нужно расшифровывать пароль. Я предполагаю, что мой вопрос более общий, относительно того, как обрабатывать данные, которые необходимо расшифровать. Я обновил свой пример, чтобы ссылаться на зашифрованное/расшифрованное значение вместо пароля.

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

Похоже, консенсус заключается в том, что сохранение расшифрованного значения в любой форме, свойстве или ином — плохая идея.

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

Всем еще раз спасибо!!


person jweekes    schedule 27.05.2014    source источник
comment
Это сильно зависит от того, как вы планируете использовать расшифрованный пароль после его получения. Можете ли вы объяснить подробнее (путем редактирования вопроса), что вы собираетесь делать с классом User, как только он у вас появится?   -  person Scott Chamberlain    schedule 28.05.2014
comment
Если вы должны хранить пароль таким образом, чтобы его можно было расшифровать для последующего использования, по крайней мере, используйте класс SecureString для его хранения в памяти. msdn.microsoft.com/en -нас/библиотека/.   -  person whoisj    schedule 28.05.2014
comment
Контроль доступа не обеспечивает безопасности, поскольку кто-то может также использовать отражение для чтения закрытых полей.   -  person John Alexiou    schedule 28.05.2014
comment
Любой, кто сделает дамп памяти, прочитает пароли бесплатно и без ошибок.   -  person John Alexiou    schedule 28.05.2014


Ответы (3)


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

Сказав это: вы должны использовать одностороннее шифрование. В противном случае SecureString. Считайте все общедоступные и частные члены небезопасными в этом контексте.

Для одностороннего шифрования некоторые основы: Зашифровать пароль. Сохраните его в базе данных. Если вы хотите проверить пароль, зашифруйте введенные данные и проверьте, соответствует ли он зашифрованному значению в базе данных. Шифрование обычно заполняется случайным значением соли.

Проверьте эту ссылку на шифрование с помощью соли: https://stackoverflow.com/a/2138588/2416958

person Stefan    schedule 27.05.2014

Лучше всего использовать метод одностороннего шифрования для шифрования пароля. Это предотвращает раскрытие исходных данных третьим лицам и может быть проверено только владельцем пароля.

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

person JAX    schedule 27.05.2014

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

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

person Farhad Alizadeh Noori    schedule 27.05.2014