在NSString中安全地清零内存

时间:2013-01-12 18:01:40

标签: objective-c security cocoa cocoa-touch memory-management

在iOS上,我想知道,如果我这样读取用户提供的密码值:

NSString* strPwd = UITextField.text;

//Check 'strPwd'
...

//How to clear out 'strPwd' from RAM?

我只是不喜欢将敏感数据“悬挂”在RAM中。知道怎么把它归零吗?

2 个答案:

答案 0 :(得分:9)

基本上你真的不能。 Apple在这个问题上存在漏洞。此外,UITextFieldNSString至少存在问题。

重申@Leo Natan现在删除的答案中的评论:

  

释放封闭的NSString对象不保证字符串   字节在内存中是零。此外,如果一个设备越狱,所有的   沙盒Apple承诺将毫无用处。但是,在这种情况下,   没有人可以做,因为有可能交换整个   运行时在应用程序运行的中间,这个得到了   来自内存的密码。

请提交另一个苹果请求此错误的错误,越多越好。

Apple Bug Reporter

答案 1 :(得分:0)

虽然NSString没有此功能(由于其他地方提到的封装原因),但难以让您的应用使用常规旧C -strings,它只是指向内存的指针。一旦你有了这个指针,当你完成它时,很容易清除它。

这对用户输入的文本字段(使用NSString - s并且我们无法更改它们)提供了帮助,但您当然可以保留所有您的应用#39; s 基于指针的内存中的敏感数据。

我没有尝试过它(我没有当前的越狱设备),但尝试使用NSMutableString也可能很有趣 - 例如:

// Code typed in browser; may need adjusting
// keep "password" in an NSMutableString
NSInteger passLength = password.length;
NSString *dummy = @"-";
while (dummy.length < passLength)
{
    dummy = [dummy stringByAppendingString: @"-"];
}

NSRange fullPass = NSMakeRange(0, passLength);
[password replaceOccurancesOfString: password
                         withString: dummy
                            options: 0
                              range: fullPass];

注意:我不知道这是否符合您的要求;这只是我在输入早期答案时想到的。即使它现在工作,我想这取决于实施,这是脆弱的(意思是:将来会破坏),所以不应该使用。

尽管如此,这可能是一个有趣的练习! :)