【发布时间】:2011-01-21 18:41:21
【问题描述】:
我正在使用列表视图控件,该控件使用 AES 加密将数据保存到文件中。我需要将列表视图中每个项目的数据保存在 std::string 的 std::list 类中。我应该只在 std::list 中加密数据并在需要时解密为局部变量吗?还是仅将其加密在文件中就足够了?
【问题讨论】:
标签: c++ security winapi encryption stl
我正在使用列表视图控件,该控件使用 AES 加密将数据保存到文件中。我需要将列表视图中每个项目的数据保存在 std::string 的 std::list 类中。我应该只在 std::list 中加密数据并在需要时解密为局部变量吗?还是仅将其加密在文件中就足够了?
【问题讨论】:
标签: c++ security winapi encryption stl
要回答这个问题,您需要考虑攻击者是谁(即您试图向谁隐藏数据?)。
为此,如果您设计一个简单的Threat Model 会有所帮助(基本上:您担心的对象、您想要保护的内容、他们可能进行的攻击类型以及风险)。
完成此操作后,您可以确定是否值得努力保护数据不被写入磁盘(即使仅在内存中进行解密)。
我知道这个答案可能看起来没有用,但我希望它可以帮助您意识到您需要明确说明(并因此知道)您的攻击者,然后才能正确防御他们(即,您可能会结束实施完全无用的防御,等等)。
【讨论】:
您会多次解密同一个项目吗?如果您不担心内存攻击,那么性能可能是另一个需要考虑的问题。
如果您有时间,可能值得编写您的解决方案以考虑两种可能性。因此,如果您选择缓存加密,那么如果性能成为问题,稍后更改为解密的内存中解决方案并不是太多工作。
【讨论】:
目前尚不清楚您要防御什么攻击。如果攻击者对系统具有本地访问权限,那么他们可以将像 OllyDBG 这样的调试器附加到进程以观察其内存。攻击方式是在调用 AES 时设置断点,然后观察传入和返回的数据,非常简单。
【讨论】:
我同意 Silky 的回答,即您必须从基本威胁模型开始。只是想指出,在处理内存中的敏感信息时,您完全有权利担心这些信息可能最终会出现在磁盘上,即使您不写出来也是如此。
例如,内存中的数据可以写入交换空间,也可以最终写入核心文件,然后从那里继续到其他地方(例如电子邮件附件或复制到其他地方)。您可以在不加密内存中的数据的情况下处理这些问题,因为这可能会将问题转移到处理密钥以解密该数据...
【讨论】: