2013-01-12 30 views
8

在iOS上,我在想,說,如果我讀用戶提供的密碼值,例如:安全地歸零內存在的NSString

NSString* strPwd = UITextField.text; 

//Check 'strPwd' 
... 

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

我只是不喜歡留在RAM中的敏感數據「晃來晃去」。任何想法如何將其歸零?

回答

9

基本上你真的不能。蘋果公司在這個問題上存在漏洞。此外,至少有UITextFieldNSString存在問題。

重申通過@Leo納坦一個現在刪除回答評論:

釋放封閉的NSString對象不保證該字符串 字節在內存零。另外,如果一臺設備越獄,蘋果承諾的所有沙盒都將無濟於事。然而,在這種情況下, 幾乎沒有人能做到的,因爲它可以交換整個 運行的應用程序的運行中,這讓從內存中 密碼。

請給蘋果請求另一個bug,越多越好。

Apple Bug Reporter

+0

哇。謝謝。 – wolfrevokcats

0

雖然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]; 

注:我沒有想法如果這做你想要的;這只是我在輸入我早先的答案時想到的。即使它現在工作現在,我想這取決於實施,這是脆弱的(意味着:在未來有可能打破),所以不應該使用。

不過,可能是一個有趣的練習! :)

+0

這就要求別人別名'password',這是不可能保證的,尤其是考慮到ObjC運行時可以讓你攔截幾乎所有東西 – Alexander