zoukankan      html  css  js  c++  java
  • iOS安全攻防(十三):数据擦除

    数据擦除

    对于敏感数据,我们不希望长时间放在内存中,而希望使用完后立即就被释放掉。
    但是不管是ARC还是MRC,自动释放池也有轮循工作周期,我们都无法控制内存数据被擦除的准确时间,让hackers们有机可乘。
    本文介绍一个小技巧——及时数据擦除。


    假如一个View Controller A的一个数据被绑在一个property上,

    1. @interface WipingMemoryViewController : UIViewController  
    2.   
    3. @property (nonatomic,copyNSString *text;  
    4. @end  


    当A push到 另外一个View Controller B时,该数据还是有可能被读到的

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



    于是,“用后即擦”变得十分必要:

    1. _text = [[NSString alloc]initWithFormat:@"information"];   
    2. NSLog(@"Origal string = %@",_text);  
    3. //do something...  
    4. charchar *string = (charchar *)CFStringGetCStringPtr((CFStringRef)_text, CFStringGetSystemEncoding());  
    5. memset(string, 0, [_text length]);  
    6. NSLog(@"final text = %@",_text);  


    Log输出如下:

    1. WipingMemory[2518:70b] Origal string = information  
    2. WipingMemory[2518:70b] final text =   

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


    还有提个醒,如果是这样

    1. _text = @"information";  

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




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

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


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

  • 相关阅读:
    蓝桥杯-最大子阵
    蓝桥杯-四平方和问题
    蓝桥杯-生日蜡烛
    蓝桥杯-三羊献瑞
    蓝桥杯-李白喝酒
    使用SSH远程管理时本地文件被修改了
    Total Commander基本配置及使用(整理)
    Linux下自己和自己用各种方法进行文件的上传下载
    idea搭建springcloud微服务框架
    将tomcat注册成服务(windows)、linux安装svn、docker、nginx、zipkin以及rabbitMQ教程
  • 原文地址:https://www.cnblogs.com/ghostll/p/3530471.html
Copyright © 2011-2022 走看看