2017-02-10 10 views
-1

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

String s = SomeComponent.Decrypt("cypherstring") 

Теперь я хотел бы скопировать содержимое s в SecureString работать. Но ... как мне избавиться от s. Я знаю, что GC собирает его здесь, но если бы я использовал эту строку некоторое время, она осталась бы. Также я хотел бы не полагаться на GC здесь, поскольку это может быть связано с безопасностью, что требует моего детективного кода.

Моя идея что-то вроде этого:

public static SecureString Convert(ref String s) 
{ 
    //copy content of s into SecureString 
    //shred s 
} 

Там не большое дело, чтобы скопировать данные в SecureString, но как «уничтожить» S?

+0

Почему, по вашему мнению, копирование будет безопаснее? вы уже создали новую строку (ы), где вывод скопирован на ... И как только он не будет использоваться снова в коде, он получит GC'd, так что если его локальная переменная будет получать GC'd довольно быстро. – EpicKip

+0

Я предполагаю, что вы могли бы использовать комбинацию «Marshall.DestroyStructure» и «Marshall.FreeHAlloc», чтобы делать то, что хотите, и вы даже можете пойти на ядерный с «GC.Collect», но я согласен с EpicKip в том, что, вероятно, это не обязательно, особенно если это локальная переменная. – Abion47

+0

Вы можете, по крайней мере, установить s на другое значение, если вы не хотите, чтобы данные были доступны для чтения, поэтому даже он не обрабатывается GC на данный момент, ничего не останется с исходным значением stringcontent – Pedro

ответ

0

Используйте этот код:

public static SecureString Convert(ref String s) 
{ 
    //copy content of s into SecureString 
    SecureString secureString; 
    unsafe 
    { 
     fixed (char* charArray = s.ToArray()) 
      secureString = new SecureString(charArray, s.Length); 
    }    
    //shred s 
    s = null; 
    GC.Collect(); 
    return secureString; 
} 

Обратите внимание, что длина, если строка не может превышает максимальную мощность SecureString. Максимальная емкость SecureString составляет 65536

+2

Возможно, это не сработает. Из MSDN: «Используйте этот метод, чтобы попытаться восстановить недопустимую память. Однако использование этого метода не гарантирует, что вся недоступная память в указанном поколении будет исправлена." – Gordon

+0

Добавлено, на что, как я уже упоминал по другому вопросу, вы не представляете, сколько раз копия этой строки могла оказаться в (в настоящее время неиспользуемой) памяти в куче, из-за того, что она была« перемещена »во время предыдущих GC (конечно, когда мы говорим «перемещен» во время GC, то, что мы на самом деле имеем в виду, скопировано и обновлены ссылки. GC не (намеренно) ничего не делает для очистки предыдущей ячейки памяти) –