對於敏感資料,我們不希望長時間放在記憶體中,而希望使用完後立即就被釋放掉。
但是不管是ARC還是MRC,自動釋放池也有輪循工作週期,我們都無法控制記憶體資料被擦除的準確時間,讓hackers們有機可乘。
本文介紹一個小技巧——及時資料擦除。
假如一個View Controller A的一個資料被綁在一個property上,
1 2 3 4 |
@interface WipingMemoryViewController : UIViewController @property (nonatomic,copy) NSString *text; @end |
當A push到 另外一個View Controller B時,該資料還是有可能被讀到的
1 2 |
WipingMemoryViewController *lastController = (WipingMemoryViewController *)self.navigationController.viewControllers[0]; NSLog(@"text = %@",lastController.text); |
於是,“用後即擦”變得十分必要:
1 2 3 4 5 6 |
_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輸出如下:
1 2 |
WipingMemory[2518:70b] Origal string = information WipingMemory[2518:70b] final text = |
可以看到,我們想要保護的資料,被有效的擦除了。
還有提個醒,如果是這樣
1 |
_text = @"information"; |
建立的字串,是會被分配到data區,而是無法修改的。
如果有興趣也有閒心,可以試試執行下面的程式碼,有彩蛋哦:
1 2 3 4 |
_text = @"information"; memset((__bridge voidvoid *)(_text), 0, _text.length - 1); NSString *myString = [[NSString alloc]initWithFormat:@"information"]; NSLog(@"Origal text : %@ \n",myString); |
編譯器把兩個information的省略到一個地址了~