блок «попытаться окончательно» против блока «использовать» при удалении SymmetricAlgorithm

Согласно документации msdn для System.Security.Cryptography.SymmetricAlgorithm

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

Все криптографические классы в .NET Framework, которые содержат конфиденциальные данные, реализуют метод Clear. При вызове метод Clear заменяет все конфиденциальные данные в объекте нулями, а затем освобождает объект, чтобы его можно было безопасно удалить сборщиком мусора. Когда объект был обнулен и освобожден, вы должны затем вызвать метод Dispose с параметром удаления, установленным на True, чтобы удалить все управляемые и неуправляемые ресурсы, связанные с объектом.

Я получаю от этого, что у меня есть использовать блок try-finally, чтобы избавиться от моего алгоритма, например:

SymmetricAlgorithm symmetricAlgorithm = SymmetricAlgorithm.Create()
try 
{
     //stuff
}
finally
{
    symmetricAlgorithm.Clear();
    symmetricAlgorithm.Dispose(true)
}

Я не смогу использовать более краткий с использованием блока

using (var symmetricAlgorithm = SymmetricAlgorithm.Create())
{
    //do stuff
}

, потому что он не очистит память. Он только пометит его для сбора. Это верно? Спасибо за помощь.

5
задан Vish 29 June 2011 в 21:32
поделиться