在iOS上,我想知道,如果我这样读取用户提供的密码值:
NSString* strPwd = UITextField.text;
//Check 'strPwd'
...
//How to clear out 'strPwd' from RAM?
我只是不喜欢将敏感数据“悬挂”在RAM中。知道怎么把它归零吗?
答案 0 :(得分:9)
UITextField
和NSString
至少存在问题。
重申@Leo Natan现在删除的答案中的评论:
释放封闭的NSString对象不保证字符串 字节在内存中是零。此外,如果一个设备越狱,所有的 沙盒Apple承诺将毫无用处。但是,在这种情况下, 没有人可以做,因为有可能交换整个 运行时在应用程序运行的中间,这个得到了 来自内存的密码。
请提交另一个苹果请求此错误的错误,越多越好。
答案 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];
注意:我不知道这是否符合您的要求;这只是我在输入早期答案时想到的。即使它现在工作,我想这取决于实施,这是脆弱的(意思是:将来会破坏),所以不应该使用。
尽管如此,这可能是一个有趣的练习! :)