【问题标题】:Keeping encrypted data in memory将加密数据保存在内存中
【发布时间】:2011-01-21 18:41:21
【问题描述】:

我正在使用列表视图控件,该控件使用 AES 加密将数据保存到文件中。我需要将列表视图中每个项目的数据保存在 std::string 的 std::list 类中。我应该只在 std::list 中加密数据并在需要时解密为局部变量吗?还是仅将其加密在文件中就足够了?

【问题讨论】:

    标签: c++ security winapi encryption stl


    【解决方案1】:

    要回答这个问题,您需要考虑攻击者是谁(即您试图向谁隐藏数据?)。

    为此,如果您设计一个简单的Threat Model 会有所帮助(基本上:您担心的对象、您想要保护的内容、他们可能进行的攻击类型以及风险)。

    完成此操作后,您可以确定是否值得努力保护数据不被写入磁盘(即使仅在内存中进行解密)。

    我知道这个答案可能看起来没有用,但我希望它可以帮助您意识到您需要明确说明(并因此知道)您的攻击者,然后才能正确防御他们(即,您可能会结束实施完全无用的防御,等等)。

    【讨论】:

      【解决方案2】:

      您会多次解密同一个项目吗?如果您不担心内存攻击,那么性能可能是另一个需要考虑的问题。

      如果您有时间,可能值得编写您的解决方案以考虑两种可能性。因此,如果您选择缓存加密,那么如果性能成为问题,稍后更改为解密的内存中解决方案并不是太多工作。

      【讨论】:

      • 是的,它会在需要时解密同一个项目。但现在我担心如果物品在容器中保持加密,我将如何对它们进行排序?
      • @Dave17:您可以保存一些元数据以方便排序(即,SortIndex 并不真正需要加密)。但值得考虑的是,这是否会向攻击者泄露任何信息(可能会也可能不会)。与往常一样,您实施的次数越多,风险就越大,因为攻击的表面积会增加,并且您越容易出错。
      • 但是如果您已经在列表视图中查看数据,为什么还需要加密数据呢?锁定那个内存区域不是更好吗?
      【解决方案3】:

      目前尚不清楚您要防御什么攻击。如果攻击者对系统具有本地访问权限,那么他们可以将像 OllyDBG 这样的调试器附加到进程以观察其内存。攻击方式是在调用 AES 时设置断点,然后观察传入和返回的数据,非常简单。

      【讨论】:

        【解决方案4】:

        我同意 Silky 的回答,即您必须从基本威胁模型开始。只是想指出,在处理内存中的敏感信息时,您完全有权利担心这些信息可能最终会出现在磁盘上,即使您不写出来也是如此。

        例如,内存中的数据可以写入交换空间,也可以最终写入核心文件,然后从那里继续到其他地方(例如电子邮件附件或复制到其他地方)。您可以在不加密内存中的数据的情况下处理这些问题,因为这可能会将问题转移到处理密钥以解密该数据...

        【讨论】:

          猜你喜欢
          • 2011-10-31
          • 1970-01-01
          • 2011-04-13
          • 2021-06-24
          • 1970-01-01
          • 2016-11-11
          • 2016-01-21
          • 1970-01-01
          相关资源
          最近更新 更多