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 对象的安全解除分配的主要内容,如果未能解决你的问题,请参考以下文章

alertView:didDismissWithButtonIndex: 消息发送到解除分配的实例

如何最好地调试 objc_msgSend 中的崩溃?

清理堆分配对象的良好做法或约定?

Swift 对象的安全内存

如何从 C# .NET 强制解除分配 COM 服务器对象

消息发送到解除分配的实例...在@synthesize 期间发送?