你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS安全攻防(十三):數據擦除

iOS安全攻防(十三):數據擦除

編輯:IOS開發綜合

數據擦除



對於敏感數據,我們不希望長時間放在內存中,而希望使用完後立即就被釋放掉。
但是不管是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的省略到一個地址了~





  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved