Согласно документации 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
}
, потому что он не очистит память. Он только пометит его для сбора. Это верно? Спасибо за помощь.