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

我想在我的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); 

释义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

更新请同时阅读内存中的敏感数据,因为如果您的iOS系统上有对手,甚至在您尝试读取内存之前,您的内存已经或多或less地受到了破坏。 总结SecureZeroMemory()或secure_memset()并没有什么帮助。

问题是NSData是不可变的,你不能控制发生什么。 如果缓冲区由您控制,您可以使用dataWithBytesNoCopy:length:并且NSData将充当包装器。 完成后,您可以memset您的缓冲区。