12

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

2 回答 2

5

解释 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 系统上有对手,那么您甚至在他尝试读取该内存之前就已经或多或少地搞砸了。总之,SecureZeroMemory() 或 secure_memset() 并没有真正的帮助。

于 2012-04-02T14:30:09.080 回答
0

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

于 2012-04-02T14:10:42.100 回答