Cryptography 我可以保留对称算法的一个实例,还是必须经常处理它?

Cryptography 我可以保留对称算法的一个实例,还是必须经常处理它?,cryptography,.net-core,Cryptography,.net Core,因此,我有一个经常加密和解密敏感值的API。我正在使用。它工作得很好,但我对这些对象的生命周期很好奇 这些示例都显示了在using语句中使用SymmentricAlgorithm实例 using (Aes aesAlg = Aes.Create()) { ... } 但是,我想知道我是否可以为应用程序的生命周期存储一个 我看了各种各样的课程。在Dispose上,它们似乎只清除内部属性(例如byte[]键) 奇怪的是,在这些示例中,ICryptoTransform没有使用语句显式地或在中处理,

因此,我有一个经常加密和解密敏感值的API。我正在使用。它工作得很好,但我对这些对象的生命周期很好奇

这些示例都显示了在
using
语句中使用
SymmentricAlgorithm
实例

using (Aes aesAlg = Aes.Create()) { ... }
但是,我想知道我是否可以为应用程序的生命周期存储一个

我看了各种各样的课程。在
Dispose
上,它们似乎只清除内部属性(例如
byte[]
键)


奇怪的是,在这些示例中,
ICryptoTransform
没有使用语句显式地或在
中处理,它还实现了
IDisposable
,并包含一些相同的敏感信息

ICryptoTransform encryptor = aesAlg.CreateEncryptor();
因为可能最好尽快创建和处置此类对象。是的,如果以后使用钥匙,可能必须保留钥匙。但此密钥也可以通过其他方式进行保护,例如,如果它位于密钥存储区内。在不需要的时候,把它放在钥匙库里可能会更安全

密码通常是轻量级对象——它们不携带那么多的状态信息。当然,每次初始化子密钥时(AES的一部分),您可能都必须执行子密钥派生,但这通常是一个相对轻量级的操作

您不想做的是开始管理这些对象。如果你打算管理它们,你很可能会忘记在需要时处理它们。此外,如果您遇到使用它们交错的情况(如:对于多个线程),那么您将得到“有趣的结果”


但是,如果您不能保留密码并销毁初始化密码的密钥,您可能会争论您是否有TLS会话。在这种情况下,保留密码可能是有益的。

我认为,使用后立即处理敏感信息是一种很好的安全做法,而且保存时间不会超过必要的时间。在应用程序的整个生命周期中保留对象将使其更容易受到可能读取其内存和检索敏感信息的攻击。这就是为什么Aes对象被放在using语句中,以便在不再需要它时尽快处理它。@M.F.这是一个很好的注释,可能是它自己的答案。。。这与我已经存储在系统某处的key和IV有什么关系,可能存储在环境变量中。这或多或少会受到类似的“攻击”吗?这是加密,所以在安全方面是错误的。尽早处理并经常处理。@AnthonyMastrean我相信它是,可能甚至比Aes对象还要多。正如Maarten在他的回答中已经提到的,也有保护密钥的方法,例如,通过依赖密钥存储。
SymmetricAlgorithm
对象只是工厂,子密钥派生之类的东西属于它们创建的
icryptransform
对象。所以它们很轻。