Я пытаюсь очистить содержимое памяти строки С# из соображений безопасности.
Я знаю класс SecureString
, но, к сожалению, я не могу использовать SecureString
вместо String
в своем приложении. Строки, которые необходимо очистить, динамически создаются во время выполнения (например, я не пытаюсь очистить строковые литералы).
Большинство результатов поиска В основном я нашел, что очистка содержимого String
невозможна (поскольку строка неизменяема) и SecureString
следует использовать.
Поэтому я придумал свое решение (используя небезопасный код) ниже. Тестирование показывает, что решения работают, но я все еще не уверен, что что-то не так с решением? Есть ли лучшие?
static unsafe bool clearString(string s, bool clearInternedString=false)
{
if (clearInternedString || string.IsInterned(s) == null)
{
fixed (char* c = s)
{
for (int i = 0; i < s.Length; i++)
c[i] = '\0';
}
return true;
}
return false;
}
РЕДАКТИРОВАТЬ: Из-за комментариев о GC, перемещающих строку вокруг до того, как clearString
вызывается: как насчет следующего фрагмента?
string s = new string('\0', len);
fixed (char* c = s)
{
// copy data from secure location to s
c[0] = ...;
c[1] = ...;
...
// do stuff with the string
// clear the string
for (int i = 0; i < s.Length; i++)
c[i] = '\0';
}