對于敏感數(shù)據(jù),我們不希望長時間放在內(nèi)存中,而希望使用完后立即就被釋放掉。
但是不管是 ARC 還是 MRC,自動釋放池也有輪循工作周期,我們都無法控制內(nèi)存數(shù)據(jù)被擦除的準確時間,讓 hackers 們有機可乘。 本文介紹一個小技巧——及時數(shù)據(jù)擦除。
假如一個 View Controller A的一個數(shù)據(jù)被綁在一個 property 上,
@interface WipingMemoryViewController : UIViewController
@property (nonatomic,copy) NSString *text;
@end
當 A push 到另外一個 View Controller B 時,該數(shù)據(jù)還是有可能被讀到的
WipingMemoryViewController *lastController = (WipingMemoryViewController *)self.navigationController.viewControllers[0];
NSLog(@"text = %@",lastController.text);
于是,“用后即擦”變得十分必要:
_text = [[NSString alloc]initWithFormat:@"information"];
NSLog(@"Origal string = %@",_text);
//do something...
charchar *string = (charchar *)CFStringGetCStringPtr((CFStringRef)_text, CFStringGetSystemEncoding());
memset(string, 0, [_text length]);
NSLog(@"final text = %@",_text);
Log 輸出如下:
WipingMemory[2518:70b] Origal string = information
WipingMemory[2518:70b] final text =
可以看到,我們想要保護的數(shù)據(jù),被有效的擦除了。
還有提個醒,如果是這樣
_text = @"information";
創(chuàng)建的字符串,是會被分配到 data 區(qū),而是無法修改的。
如果有興趣也有閑心,可以試試運行下面的代碼,有彩蛋哦:
_text = @"information";
memset((__bridge voidvoid *)(_text), 0, _text.length - 1);
NSString *myString = [[NSString alloc]initWithFormat:@"information"];
NSLog(@"Origal text : %@ \n",myString);
編譯器把兩個 information 的省略到一個地址了~