在iOS上,我在想,說,如果我讀用戶提供的密碼值,例如:安全地歸零內存在的NSString
NSString* strPwd = UITextField.text;
//Check 'strPwd'
...
//How to clear out 'strPwd' from RAM?
我只是不喜歡留在RAM中的敏感數據「晃來晃去」。任何想法如何將其歸零?
在iOS上,我在想,說,如果我讀用戶提供的密碼值,例如:安全地歸零內存在的NSString
NSString* strPwd = UITextField.text;
//Check 'strPwd'
...
//How to clear out 'strPwd' from RAM?
我只是不喜歡留在RAM中的敏感數據「晃來晃去」。任何想法如何將其歸零?
基本上你真的不能。蘋果公司在這個問題上存在漏洞。此外,至少有UITextField
和NSString
存在問題。
重申通過@Leo納坦一個現在刪除回答評論:
釋放封閉的NSString對象不保證該字符串 字節在內存零。另外,如果一臺設備越獄,蘋果承諾的所有沙盒都將無濟於事。然而,在這種情況下, 幾乎沒有人能做到的,因爲它可以交換整個 運行的應用程序的運行中,這讓從內存中 密碼。
請給蘋果請求另一個bug,越多越好。
雖然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];
注:我沒有想法如果這做你想要的;這只是我在輸入我早先的答案時想到的。即使它現在工作現在,我想這取決於實施,這是脆弱的(意味着:在未來有可能打破),所以不應該使用。
不過,可能是一個有趣的練習! :)
這就要求別人別名'password',這是不可能保證的,尤其是考慮到ObjC運行時可以讓你攔截幾乎所有東西 – Alexander
哇。謝謝。 – wolfrevokcats