在iOS上,我想知道,如果我读取用户提供的密码值:
NSString* strPwd = UITextField.text;
//Check 'strPwd'
...
//How to clear out 'strPwd' from RAM?
我只是不喜欢把敏感数据"悬挂"在RAM中。知道怎么把它归零吗?
基本上你真的不能。在这个问题上,苹果公司收到了一些漏洞。此外,UITextField
和NSString
至少存在问题。
重申@Leo Natan已删除的回复中的评论:
释放封闭的NSString对象并不能保证该字符串字节在内存中是零。而且,如果设备越狱了,所有的苹果的沙箱承诺将毫无用处。然而,在这种情况下,没有什么可以做的,因为有可能交换整个运行时在应用程序运行的中间,这得到密码来自内存
请向苹果公司提交另一个bug,越多越好。
Apple Bug Reporter
虽然NSString
没有这个功能(由于封装的原因在别处提到),它不应该是太很难让你的应用程序使用常规的旧c字符串,这只是指向内存的指针。一旦你有了这个指针,当你完成的时候,清除这些东西是相当容易的。
这对用户输入的文本字段没有帮助(使用NSString
-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];
注意:我不知道这是不是你想要的;这只是我在输入我之前的答案时想到的。即使它现在工作,我想这取决于实现,这是脆弱的(意思是:在未来可能会破坏),所以不应该使用
。仍然,可能是一个有趣的练习!:)