iOS安全攻防(十三):數據擦除 – iPhone手機開發技術文章 iPhone軟體開發教學課程

數據擦除

對於敏感數據,我們不希望長時間放在內存中,而希望使用完後立即就被釋放掉。
但是不管是ARC還是MRC,自動釋放池也有輪循工作周期,我們都無法控制內存數據被擦除的準確時間,讓hackers們有機可乘。
本文介紹一個小技巧——及時數據擦除。

假如一個View Controller A的一個數據被綁在一個property上,

@interface WipingMemoryViewController : UIViewController

@property (nonatomic,copy) NSString *text;
@end

當A push到 另外一個View Controller B時,該數據還是有可能被讀到的

WipingMemoryViewController *lastController = (WipingMemoryViewController *)self.navigationController.viewControllers[0];
NSLog(@"text = %@",lastController.text);

於是,“用後即擦”變得十分必要:

_text = [[NSString alloc]initWithFormat:@"information"]; 
NSLog(@"Origal string = %@",_text);
//do something...
char *string = (char *)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 = 

可以看到,我們想要保護的數據,被有效的擦除瞭。

還有提個醒,如果是這樣

_text = @"information";

創建的字符串,是會被分配到data區,而是無法修改的。

如果有興趣也有閑心,可以試試運行下面的代碼,有彩蛋哦:

_text = @"information";
memset((__bridge void *)(_text), 0, _text.length - 1);
NSString *myString = [[NSString alloc]initWithFormat:@"information"];
NSLog(@"Origal text : %@ \n",myString);

編譯器把兩個information的省略到一個地址瞭~

發佈留言