Я работаю над приложением .NET Windows Forms, которое обрабатывает конфиденциальные текстовые данные. Данные необходимо поместить в элементы управления TextBox и RichTextBox, и ими также можно манипулировать с помощью объектов String.
Из-за этого в памяти приложения, но эти копии данных останутся в памяти после закрытия приложения.
Цитата Microsoft:
Экземпляр класса System.String одновременно является неизменяемым и, если он
больше не нужен, его нельзя программно запланировать для
сборки мусора; то есть экземпляр доступен только для чтения после его создания,
и невозможно предсказать, когда экземпляр будет удален
из памяти компьютера. Поскольку экземпляры System.String являются неизменяемыми,
операции, которые кажутся изменяющими существующий экземпляр, на самом деле создают
его копию для манипуляций. Следовательно, если объект String содержит
конфиденциальную информацию, такую как пароль, номер кредитной карты или
персональные данные, существует риск, что эта информация может быть раскрыта после
его использования, поскольку ваше приложение не может удалить данные из
памяти компьютера. ... Сборка мусора для объектов String
недетерминирована. Кроме того, поскольку его память не закреплена,
сборщик мусора будет создавать дополнительные копии строковых значений при
перемещении и сжатии памяти.
Как можно безопасно стереть память приложения при выходе из приложения? Скажем, заполнить память нулями. Можно запустить другой процесс, который стирает память родительского процесса. Но как найти весь объем памяти процесса, сопоставить виртуальную память с физической и выполнить запись в физическую память? Возможно ли это вообще?
Я попробовал прикрепить веревку. Предполагается, что она должна оставаться в одном месте в памяти, но поскольку строки неизменяемы, их нельзя перезаписать, присвоив переменной новое значение. Каждый раз, когда вы меняете закрепленную строку, в памяти создается ее новая копия, а старая копия остается по закрепленному адресу в памяти.
Защищенные строки здесь не помогут, либо.
Этот вопрос не дублирует вопрос «Очищает ли Windows страницы памяти по трем причинам:
Во-первых» , хотя известно, что Windows стирает память перед тем, как выделить ее другим процессам, точное время этого стирания невозможно предсказать, поэтому конфиденциальные данные могут оставаться в памяти неопределенное время.
Во-вторых, в другом вопросе не было вопроса о том, как вручную стереть память приложения. Он спросил о том, делает ли ОС это автоматически.
И в-третьих, предложенный ответ относится к C++, а не к .NET, и не решает проблему, так как автор пытается стереть только одну копию. переменной, при этом в памяти к тому времени будет несколько ее копий. Вопрос был в другом, и предложенное решение не работает и не отвечает на мой вопрос (элементы управления TextBox даже не упоминаются).
Подробнее здесь: https://stackoverflow.com/questions/783 ... tions-exit