在iOS中从内存中清除敏感数据的正确方法是什么?

时间:2012-04-02 08:41:34

标签: ios security memory memset

我想在iOS应用中清除内存中的敏感数据。 在Windows中我曾经使用过SecureZeroMemory。现在,在iOS中,我使用普通的旧memset,但我有点担心编译器可能会优化它: https://buildsecurityin.us-cert.gov/bsi/articles/knowledge/coding/771-BSI.html

代码段:

 NSData *someSensitiveData;
 memset((void *)someSensitiveData.bytes, 0, someSensitiveData.length);

2 个答案:

答案 0 :(得分:3)

释义771-BSI(链接见OP):

避免编译器优化的memset调用的一种方法是在memset调用之后再次访问缓冲区,这会强制编译器不优化位置。这可以通过

来实现
*(volatile char*)buffer = *(volatile char*)buffer;
memset()电话之后

事实上,你可以写一个secure_memset()函数

void* secure_memset(void *v, int c, size_t n) {
    volatile char *p = v;
    while (n--) *p++ = c;
    return v;
}

(代码取自771-BSI。感谢Daniel Trebbien指出上一个代码提案可能存在的缺陷。)

为什么volatile会阻止优化?见https://stackoverflow.com/a/3604588/220060

更新请同时阅读Sensitive Data In Memory,因为如果您的iOS系统上有对手,即使在他尝试读取内存之前,您已经或多或少地被搞砸了。在摘要中,SecureZeroMemory()或secure_memset()实际上没有帮助。

答案 1 :(得分:0)

问题是NSData是不可变的,你无法控制发生的事情。如果缓冲区由您控制,则可以使用dataWithBytesNoCopy:length:并且NSData将充当包装器。完成后,您可以设置缓冲区。