iOS 设备上 ObjC 对象的安全解除分配
Posted
技术标签:
【中文标题】iOS 设备上 ObjC 对象的安全解除分配【英文标题】:Secure dealloc of an ObjC object on an iOS device 【发布时间】:2010-11-03 13:26:56 【问题描述】:当一个对象被释放时会发生什么?是所有的记忆都消失了,还是留下了痕迹?
如果我理解正确,如果应用程序退出活动,它的内存会保存到闪存中。假设一个足智多谋的黑客能够读出这个内存。如果该内存没有被某些东西覆盖,他理论上是否有时能够读出已解除分配的NSString
的内容?
【问题讨论】:
【参考方案1】:不要将安全数据存储在 Objective C 数据类型中。它们是不透明的数据类型,每次您尝试清除某些部分时,它们可能会在内存中制作和/或留下大量数据副本。
已添加:Swift 数据类型似乎也是如此,包括结构、数组和字符串。它们是不透明的,因此谁知道在 DRAM 中可能会留下多少数据副本。
使用非透明的纯 C 数据类型(字符数组等),您可以在使用完它们后立即将其归零,并且每当应用程序退出处于活动状态时。您还可以对数组元素进行模糊处理,使通过内存转储进行字符串搜索变得更加困难。
【讨论】:
您对如何降低 UITextField 对象(secureTextEntry 属性设置为 Yes)在将输入的内容放入 C 数组之前将副本留在内存中的风险有任何想法吗?跨度> 也许最好重写——textField:shouldChangeCharactersInRange:replacementString: 并且根本不将实际字符串存储在不透明的 UITextField 对象中,而是手动修改 C 数组?我不太确定如何仍然允许显示最后输入的字符,但也许我也可以解决这个问题。 @user362178:一般来说,你也可以在你的 Obj-C 对象的-dealloc
方法中使用 hotpaw2 的建议,即在你还没有的情况下在这里清零对象的原始成员.【参考方案2】:
即使使用越狱的 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 :)
【讨论】:
如果应用程序承诺提供最大的安全性,我认为不太可能并且可能已经足够好了,所以如果有可能获得这些解除分配的数据,我将不得不寻求解决方案像这样。谢谢,我有点期待必须走这条路。【参考方案3】:所以您还提出了关于写入 Flash 的问题。如果您的应用程序进入后台,它不一定会释放对象 - 并让您有机会擦除它们(如另一个答案中所述)。
如果您真的对此感到担忧 - 除了在 dealloc 上实现某种对象过度擦除代码(如上所述)之外,我会在您的应用上禁用 Fast App Switching 以确保这种情况永远不会发生。
【讨论】:
感谢有关如何处理应用切换的建议。我必须研究应用程序失去活动状态的不同方式,并考虑到这一点。以上是关于iOS 设备上 ObjC 对象的安全解除分配的主要内容,如果未能解决你的问题,请参考以下文章