出于安全原因,我们需要始终从内存中删除敏感数据。 通常这不是我在 IOS 中看到的事情,但对于需要扩展安全性的应用程序来说,这是非常重要的。
如果是NSData和NSString对象,通常需要删除的数据(指向nil不会删除数据,属于安全漏洞)
我已成功使用以下代码删除了我的 NSString(当密码为 NSString 时):
unsigned char *charPass;
if (password != nil) {
charPass = (unsigned char*) CFStringGetCStringPtr((CFStringRef) password, CFStringGetSystemEncoding());
memset(charPass, 0, [password length]);
password = nil;
}
- 关于此实现的重要说明:在调用 charPass 之前必须检查 NULL,否则可能会崩溃。不保证 CFStringGetCStringPtr 将返回一个值!
当密码是 NSData 时,它应该更加简单,并且下面的代码应该可以工作:
memset([password bytes], 0, [password length]);
但这给了我一个编译错误:
No matching function for call to 'memset'
我找不到指向密码地址并删除那里的字节的解决方法,就像我对字符串所做的那样(字节方法应该让我根据我的理解做到这一点,但由于某种原因它无法编译我无法弄清楚)
有人对此有想法吗?
10x
最佳答案
您的字符串解除分配器很脆弱。你写:
Big remark on this implementation: You HAVE to check for NULL before calling the charPass or it might crash. There is NO guarantee that CFStringGetCStringPtr will return a value!
此行为记录为 CFString
(因此 NSString
)不保证您直接访问其内部缓冲区。您没有说明如何处理这种情况,但如果您不删除内存,则可能存在安全问题。
如果您确实获得了有效的指针,则说明您使用了错误的字节数。来电[password length]
返回:
The number of UTF-16 code units in the receiver.
这与字节数不同。然而CFStringGetCStringPtr
返回:
A pointer to a C string or NULL if the internal storage of theString does not allow this to be returned efficiently.
如果您有 C 字符串,则可以使用 C 库函数 strlen()
找出它的长度。
解决 CFStringGetCStringPtr
时的情况返回NULL
您可以自己创建字符串 CFString
并提供定制CFAllocater
。您不需要自己编写完整的分配器,而是可以基于系统分配器构建一个分配器。您可以获得默认分配器 CFAllocatorContext
这将返回系统使用的函数指针。然后您可以创建一个新的 CFAllocator
基于CFAllocatorContext
这是默认副本的副本,除非您更改了 deallocate
和reallocate
指向您已按照默认 allocate
实现的函数的指针, reallocate
和deallocate
还可以调用memset
适本地清除内存。
完成此操作后,安全删除就可以归结为确保这些自定义创建的 CFString
对象,又名 NSString
对象,在您的应用程序退出之前被释放。
您可以了解CFAllocator
, CFAllocatorContext
等Memory Management Programming Guide for Core Foundation .
这给我们带来了您的实际问题,如何将NSData
归零。你很幸运 NSData
对象是 CFData
对象,以及CFData
的CFDataGetBytePtr
,与 CFStringGetCStringPtr
不同,保证直接从文档返回指向实际字节的指针:
This function is guaranteed to return a pointer to a
CFData
object's internal bytes.CFData
, unlikeCFString
, does not hide its internal storage.
因此,请按照 CFString
的模式编写代码将在这里工作。请注意,使用 NSData
的bytes
文档不保证调用 CFDataGetBytePtr
,例如可以调用 CFDataGetBytes
并返回字节的副本,使用 CFData
功能。
HTH
关于ios - OBJ-C 在无效之前删除 NSData 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51806557/