所以,我有一个经常加密和解密敏感值的API。我正在使用System.Security.Cryptography.Aes
。它工作正常,但我对这些对象的生命周期感到好奇。
示例都显示在SymmentricAlgorithm
语句中使用using
个实例。
using (Aes aesAlg = Aes.Create()) { ... }
但是,我想知道我是否可以在应用程序的生命周期中存储一个...
我查看了各种类的source code。在Dispose
上,他们似乎只清除了内部属性(例如byte[]
键)。
奇怪的是,在这些示例中,ICryptoTransform
未明确地或在using
语句中处理,它还实现IDisposable
并包含一些相同的内容敏感信息!
ICryptoTransform encryptor = aesAlg.CreateEncryptor();
答案 0 :(得分:1)
作为M.F. has already mentioned,最好尽快创建和处理这类对象。是的,如果以后使用密钥可能必须保留。但是这个密钥也可以通过其他方式保护,例如如果它在钥匙商店内。可能在不需要时将它保存在密钥存储区中会更安全。
密码通常是轻量级的对象 - 它们不会承载所有这些状态。当然,每次初始化一个(AES的一部分)时,您可能必须执行子密钥派生,但这通常是一个相对轻量级的操作。
您不想做的是开始管理这些对象。如果您要管理它们,您有可能在需要时忘记丢弃它们。此外,如果您遇到过交错使用它们的情况(如:对于多个线程),那么您将获得有趣的结果"。
然而,你可以辩论,如果你有例如一个TLS会话,如果您不能只保留密码并销毁您初始化它的密钥。这可能是一个用例,保持密码可能是有益的。