2010-02-27 45 views
3

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

回答

6

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

为此,如果您制作了一个简单的Threat Model(基本上:您担心的是谁,您想保护什么,可以执行的攻击类型以及其风险),这会有所帮助。

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

我知道这个答案可能看起来不太有用,但我希望它能帮助你意识到在你能够正确地防御他们之前你需要特别说明你的攻击者(并因此知道)你(也就是说,你可能最终实现完全无用的防御,等等)。

0

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

如果您有时间,可能需要对解决方案进行编码以适应两种可能性。因此,如果您选择缓存加密,那么如果性能成为问题,那么稍后更改为解密的内存中解决方案并不是太多工作。

+0

是的,它将在需要时解密相同的项目。但现在我担心如果将这些项目保存在容器中,我将如何对这些项目进行排序? – cpx 2010-02-27 14:11:08

+0

@ Dave17:您可以容纳一些元数据以便于排序(即SortIndex并不需要加密)。但值得考虑的是,这是否会泄露任何信息(可能会或可能不会)给攻击者。与往常一样,实施得越多,风险就越高,因为攻击的表面积增大,并且更容易出现错误。 – 2010-02-27 14:26:04

+0

但是如果你已经在listview中查看它,你为什么需要加密数据?只是锁定内存区域不是更好吗? – cpx 2010-02-27 14:53:16

0

目前还不清楚你试图抵御什么攻击。如果攻击者拥有对系统的本地访问权限,那么他们可以将一个像OllyDBG这样的调试器附加到进程中以观察其内存。攻击的目的是在对AES的调用中设置一个断点,然后观察传入并返回的数据,非常简单。

0

我同意柔滑的回答,你必须从基本的威胁模型开始。只是想指出,在处理内存中的敏感信息时,即使没有写出信息,您也有权利担心信息可能会在磁盘上结束。

例如,内存中的数据可能写入交换空间,或者可能以核心文件形式存在,并可能从其他位置(如电子邮件附件或复制到其他位置)存在。你可以在没有加密内存中的数据的情况下处理这些问题,因为这可能只是将问题转移到处理密钥以解密该数据...