У меня есть цель высокого уровня создания класса 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
, особенно потому, что он, вероятно, связан с внешними lib файлами на уровне ОС. Есть ли какие-либо оговорки в этом, поскольку я поддерживаю объектыICryptoTransform
? -
Потенциально самый важный вопрос в многопотоковой среде я столкнулся с проблемами при совместном использовании объектов
ICryptoTransform
между потоками? -
Если ответ на №3 заключается в том, что он не является потокобезопасным, будет ли я испытывать серьезную деградацию производительности от блокировки, когда я использую объекты
ICryptoTransform
? (Зависит от нагрузки, я полагаю.) -
Было бы более сложно просто создавать новые
RijndaelManaged
каждый раз? Или сохранить одинRijndaelManaged
и генерироватьnew RijndaelManaged().CreateEncryptor(...)
каждый раз?
Я надеюсь, что кто-то там знает, как они работают под капотом или испытывают проблемы из подобных реализаций. Я обнаружил, что многие из этих видов производительности и связанных с потоком проблем обычно не проявляются до тех пор, пока не будет значительного количества нагрузки.
Спасибо!