代码之家  ›  专栏  ›  技术社区  ›  Anthony Mastrean PavanDevarakonda

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

  •  0
  • Anthony Mastrean PavanDevarakonda  · 技术社区  · 8 年前

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

    这些示例都显示了使用 SymmentricAlgorithm a中的实例 using 陈述

    using (Aes aesAlg = Aes.Create()) { ... }
    

    但是,我想知道我是否可以为应用程序的生命周期存储一个。。。

    我看了看 source code 对于各种此类课程。在…上 Dispose ,它们似乎只清除内部属性( byte[] 例如,键)。


    奇怪的是,在这些例子中 ICryptoTransform 未显式或在 使用 语句,它还实现 IDisposable 并且包含一些相同的敏感信息!

    ICryptoTransform encryptor = aesAlg.CreateEncryptor();
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Maarten Bodewes    8 年前

    M.F. has already mentioned 最好尽快创建和处置此类对象。是的,如果以后使用钥匙,可能需要保留钥匙。但此密钥也可以通过其他方式进行保护,例如,如果它位于密钥存储区内。如果不需要的话,把它放在钥匙库里可能会更安全。

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

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

    但是,如果您不能保留密码并销毁初始化密码的密钥,您可能会争论是否有TLS会话。这可能是一个保留密码可能有益的用例。