在iOS中,清除敏感数据的正确方式是什么?

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);
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://dev59.com/SXA65IYBdhLWcg3w1SbU#3604588

更新 请还要阅读内存中的敏感数据,因为如果您的iOS系统上有对手,他尝试读取该存储器之前,您就已经相当没办法了。简而言之,SecureZeroMemory()或secure_memset()并没有真正起到帮助作用。


你的secure_memset函数可能不够安全。根据http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1381.pdf,有些优化编译器只会将第一个字节清零。 - Daniel Trebbien
不是我的,它来自771-BSI。 - nalply
也许页面改变了?如果您再看一遍,它们有一个循环volatile char *p = v; while (n--) *p++ = c; - Daniel Trebbien
@DanielTrebbien 谢谢,你的关注似乎是一个有效的问题。我已更新我的答案。 - nalply
@MartinBonner,也许是这样,但我不这么认为。secure_memset()并不能真正帮助,因为黑客可以在函数调用之前设置断点并读取内存。甚至这个调用可能会帮助黑客发现您安全性的关键部分。如果有的话,您最多只能获得微小的安全提升,但却失去了简单性。 - nalply
显示剩余5条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接