【发布时间】:2010-11-03 13:26:56
【问题描述】:
当一个对象被释放时会发生什么?是所有的记忆都消失了,还是留下了痕迹?
如果我理解正确,如果应用程序退出活动,它的内存会保存到闪存中。假设一个足智多谋的黑客能够读出这个内存。如果该内存没有被某些东西覆盖,他理论上是否有时能够读出已解除分配的NSString 的内容?
【问题讨论】:
标签: ios objective-c security memory-management
当一个对象被释放时会发生什么?是所有的记忆都消失了,还是留下了痕迹?
如果我理解正确,如果应用程序退出活动,它的内存会保存到闪存中。假设一个足智多谋的黑客能够读出这个内存。如果该内存没有被某些东西覆盖,他理论上是否有时能够读出已解除分配的NSString 的内容?
【问题讨论】:
标签: ios objective-c security memory-management
不要将安全数据存储在 Objective C 数据类型中。它们是不透明的数据类型,每次您尝试清除某些部分时,它们可能会在内存中制作和/或留下大量数据副本。
已添加:Swift 数据类型似乎也是如此,包括结构、数组和字符串。它们是不透明的,因此谁知道在 DRAM 中可能会留下多少数据副本。
使用非透明的纯 C 数据类型(字符数组等),您可以在使用完它们后立即将其归零,并且每当应用程序退出处于活动状态时。您还可以对数组元素进行模糊处理,使通过内存转储进行字符串搜索变得更加困难。
【讨论】:
-dealloc 方法中使用 hotpaw2 的建议,即在你还没有的情况下在这里清零对象的原始成员.
即使使用越狱的 iDevice,这也不太可能,因为内存的位置可能很深。如果你真的很担心,这里有一个解决方案,如果你不担心 NSMutableString 的开销(你的类的 dealloc):
-(void) dealloc
{
for (int i = 0; i < [myString length]; i++)
{
[myString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"*"];
}
[myString release]; // or dealloc
// clean up rest
[super dealloc]; // dont forget this :)
}
【讨论】:
所以您还提出了关于写入 Flash 的问题。如果您的应用程序进入后台,它不一定会释放对象 - 并让您有机会擦除它们(如另一个答案中所述)。
如果您真的对此感到担忧 - 除了在 dealloc 上实现某种对象过度擦除代码(如上所述)之外,我会在您的应用上禁用 Fast App Switching 以确保这种情况永远不会发生。
【讨论】: