离线下载
PDF版 ePub版

念茜 · 更新于 2018-11-28 11:00:43

数据擦除

对于敏感数据,我们不希望长时间放在内存中,而希望使用完后立即就被释放掉。

但是不管是 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...  
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 =  

可以看到,我们想要保护的数据,被有效的擦除了。

还有提个醒,如果是这样

_text = @"information";

创建的字符串,是会被分配到 data 区,而是无法修改的。

如果有兴趣也有闲心,可以试试运行下面的代码,有彩蛋哦:

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

编译器把两个 information 的省略到一个地址了~