2010-11-03 64 views
4

對象在處理時會發生什麼?難道所有的記憶都消失了嗎?或者痕跡仍然存在?iOS設備上的ObjC對象的安全釋放

如果我理解正確的話,應用程序的內存被保存,如果它主動辭職到閃存存儲。假設一個能夠讀出這個內存的資源豐富的黑客。如果該記憶沒有被某些東西覆蓋,他理論上有時能夠讀出已處理的NSString的內容嗎?

回答

5

不要將安全數據存儲在Objective C數據類型中。它們是不透明的數據類型,每次嘗試清除某些部分時,都可能在內存中製作和/或留下大量數據副本。

加了:相同的似乎是約夫特數據類型,包括結構,數組和字符串真。它們是不透明的,因此誰知道DRAM中可能會留下多少數據副本。

使用非不透明純C數據類型(陣列的字符,等等),它可以,只要你正在使用完bzero,每當應用程序被辭職活性。您還可以混淆數組元素,以便通過內存轉儲進行字符串搜索更加困難。

+0

非常好的點 – user362178 2010-11-03 17:00:16

+0

對於如何降低UITextField對象(將secureTextEntry屬性設置爲Yes)的風險,您可以在將輸入內容放入C數組之前將內容保留在內存中嗎? – user362178 2010-11-03 17:06:12

+0

也許最好重寫 - textField:shouldChangeCharactersInRange:replacementString:並不是將實際的字符串存儲在不透明的UITextField對象中,而是手動修改C數組?我不確定如何仍然允許最後輸入的字符顯示,但也許我可以爲此做些工作。 – user362178 2010-11-03 17:11:55

1

即使有一個越獄的iDevice,這將是不可能的,因爲在內存中的位置可能是如此之深。如果你真的關心的是,這裏是一個解決方案,如果你不擔心的NSMutableString(你的類的dealloc)的開銷:

-(void) dealloc 
{ 
    for (int i = 0; i < [myString length]; i++) 
    { 
      [myString replaceCharactersInRange:NSMakeRange(i, 1) withString:@"*"]; 
    } 
    [myString release]; // or dealloc 
    // clean up rest 
    [super dealloc]; // dont forget this :) 
} 
+0

我不認爲不太可能,可能是不夠好,如果應用程序的承諾,提供最大的安全性,因此,如果它在所有可能獲得這樣的dealloced數據,我會去這樣一個解決方案。謝謝,我有點期待不得不走這條路。 – user362178 2010-11-03 15:03:17

1

所以,你也提出了這個問題有關注銷閃存。如果您的應用進入後臺,它將而不是必然釋放對象 - 並給您擦除它們的機會(如其他答案中所述)。

,如果你真的關心這個 - 我對你的應用程序禁用快速切換應用程序,以確保這不會發生,除執行上的dealloc某種物體過度擦除碼,如上所述。

+0

感謝您提供關於如何處理應用切換的建議。我將不得不研究應用程序失去活動狀態的不同方式,並考慮到這一點。 – user362178 2010-11-03 15:06:25