У меня есть общая цель - создать служебный класс static , который инкапсулирует шифрование для моего приложения .NET. Внутри я бы хотел минимизировать ненужные создания объектов.
У меня такой вопрос: Что такое потокобезопасность классов, которые реализуют симметричное шифрование в .NET Framework? В частности System.Security.Cryptography.RijndaelManaged
и типы ICryptoTransform
, которые он генерирует.
Например, в конструкторе моего класса я могу просто сделать что-то вроде следующего:
static MyUtility()
{
using (RijndaelManaged rm = new RijndaelManaged())
{
MyUtility.EncryptorTransform = rm.CreateEncryptor(MyUtility.MyKey, MyUtility.MyIV);
MyUtility.DecryptorTransform = rm.CreateDecryptor(MyUtility.MyKey, MyUtility.MyIV);
}
}
Обойдя стороной вопрос о том, насколько безопасно иметь Ключ и IV в этом классе , этот пример блока поднимает ряд других вопросов:
Могу ли я снова и снова использовать EncryptorTransform и DecryptorTransform снова и снова? Свойства *.CanReuseTransform
и *.CanTransformMultipleBlocks
подразумевают "да", но есть ли какие-то предостережения, о которых я должен знать?
Поскольку RijndaelManaged
реализует IDisposable
, я склонен помещать его в блок using
, тем более что он, вероятно, связан с внешними библиотеками уровня ОС. Есть ли какие-то предостережения с этим, так как я держу ICryptoTransform
объекты вокруг?
Потенциально самый важный вопрос, в многопоточной среде, возникнут ли у меня проблемы с разделением объектов ICryptoTransform
между потоками?
Если ответ на вопрос № 3 заключается в том, что он не является поточно-ориентированным, столкнусь ли я с серьезным снижением производительности из-за блокировки при использовании объектов ICryptoTransform
? (Зависит от нагрузки, я полагаю.)
Будет ли эффективнее просто создавать новые RijndaelManaged
каждый раз? Или хранить один RijndaelManaged
и генерировать new RijndaelManaged().CreateEncryptor(...)
каждый раз?
Я надеюсь, что кто-то там знает, как они работают под капотом или испытывают проблемы с аналогичными реализациями. Я обнаружил, что многие из этих проблем с производительностью и потоками, как правило, не проявляются до тех пор, пока не произойдет значительная нагрузка.
Спасибо!