【问题标题】:Securely zero out memory in NSString安全地将 NSString 中的内存归零
【发布时间】:2012-12-27 02:29:50
【问题描述】:

在 iOS 上,我想知道,如果我这样读取用户提供的密码值:

NSString* strPwd = UITextField.text;

//Check 'strPwd'
...

//How to clear out 'strPwd' from RAM?

我只是不喜欢让敏感数据“悬空”在 RAM 中。知道如何将其归零吗?

【问题讨论】:

    标签: objective-c security cocoa cocoa-touch memory-management


    【解决方案1】:

    基本上你真的不能。在这个确切的问题上,Apple 提交了一些错误。此外,UITextFieldNSString 至少存在问题。

    重申@Leo Natan 现已删除的答案中的评论:

    释放封闭的 NSString 对象并不能保证字符串 字节是内存中的零。此外,如果设备越狱,所有 沙盒苹果承诺将毫无用处。然而,在这种情况下, 几乎没有人可以做,因为可以交换整个 运行时在应用程序运行的中间,这得到 记忆中的密码。

    请向苹果提出另一个错误请求,越多越好。

    Apple Bug Reporter

    【讨论】:

    • 链接失效了,请问您还有其他有效的链接或详细文章吗?
    【解决方案2】:

    虽然NSString 没有此功能(出于其他地方提到的封装原因),但让您的应用使用常规的旧 C 字符串应该不会困难,它们只是指向内存的指针。一旦你有了那个指针,完成后就很容易清除。

    这对用户输入的文本字段没有帮助(使用 NSString-s,我们无法更改它们),但您当然可以保留所有应用的敏感数据在基于指针的内存中。

    我还没有尝试过它(我没有当前越狱的设备),但尝试NSMutableString 也可能很有趣——比如:

    // Code typed in browser; may need adjusting
    // keep "password" in an NSMutableString
    NSInteger passLength = password.length;
    NSString *dummy = @"-";
    while (dummy.length < passLength)
    {
        dummy = [dummy stringByAppendingString: @"-"];
    }
    
    NSRange fullPass = NSMakeRange(0, passLength);
    [password replaceOccurancesOfString: password
                             withString: dummy
                                options: 0
                                  range: fullPass];
    

    注意:我不知道这是否符合您的要求;这只是我在输入之前的答案时想到的。即使它确实现在工作了,我想这取决于实现,它是脆弱的(意思是:将来可能会破坏),所以不应该使用。

    不过,这可能是一个有趣的练习! :)

    【讨论】:

    • 这要求没有其他人别名password,这是不可能保证的,特别是考虑到ObjC运行时可以让你拦截几乎所有东西
    猜你喜欢
    • 2017-02-19
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多