HyB*_*RiD 11 memory security memset 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);
Run Code Online (Sandbox Code Playgroud)
释义 771-BSI(链接见 OP):
避免编译器优化 memset 调用的一种方法是在 memset 调用后以强制编译器不优化位置的方式再次访问缓冲区。这可以通过
*(volatile char*)buffer = *(volatile char*)buffer;
Run Code Online (Sandbox Code Playgroud)
后memset()调用。
事实上,你可以写一个secure_memset()函数
void* secure_memset(void *v, int c, size_t n) {
volatile char *p = v;
while (n--) *p++ = c;
return v;
}
Run Code Online (Sandbox Code Playgroud)
(代码取自 771-BSI。感谢 Daniel Trebbien 指出之前的代码提案可能存在的缺陷。)
为什么会volatile阻止优化?见/sf/answers/252321191/
更新请同时阅读内存中的敏感数据,因为如果你的 iOS 系统上有一个对手,你甚至在他试图读取该内存之前就已经或多或少地搞砸了。总之, SecureZeroMemory() 或 secure_memset() 并没有真正的帮助。