我正在研究iPhone如何管理堆和堆栈,但很难找到有关此问题的良好信息来源。我试图追踪密码在内存中的保存方式,即使在NSString
被解除分配后也是如此。
据我所知,一旦ARC中的释放计数降至0,iPhone就不会清除内存内容(写入零或垃圾)。因此带有密码的字符串将存在内存中,直到该内存位置为重写的。
在Xcode中有一个调试选项Malloc Scribble
,用于调试内存问题,通过启用/禁用此选项(以及禁用Zombies)来填充已释放的内存0x55
,以及模拟器的内存转储(使用gcore
)我可以检查内容是否已在内存中替换0x55
。
我想知道这是否可以通过Apple Store构建完成,用垃圾数据填充解除分配的内存,如果我假设iPhone默认不这样做是正确与否,或者是否有任何问题处理内存中敏感数据的其他更好的选择,以及在使用它之后应该如何清除它(可变数据可能?写入该内存位置?)
答案 0 :(得分:0)
我不认为可以在构建设置级别完成某些操作。但是,您可以通过将内存归零来应用某种内存清理(使用带有指向字符串的指针使用memset
)。
答案 1 :(得分:0)
正如@Artal所说,memset
可用于写入记忆位置。我发现这个框架"iMAS Secure Memory"可以用来处理这个问题:
" iMAS安全记忆"框架提供了一组工具 保护,清除和验证内存区域和个人 变量。它允许对象覆盖它的数据部分 在内存中加密版本或空字节
他们有一个清除记忆位置应该有用的方法:
// Return NO if wipe failed
extern inline BOOL wipe(NSObject* obj) {
NSLog(@"Object pointer: %p", obj);
if(handleType(obj, @"", &wipeWrapper) == YES) {
if (getSize(obj) > 0){
NSLog(@"WIPE OBJ");
memset(getStart(obj), 0, getSize(obj));
}
else
NSLog(@"WIPE: Unsupported Object.");
}
return YES;
}