ios - OBJ-C 在无效之前删除 NSData 内容

标签 ios objective-c nsstring nsdata memset

出于安全原因,我们需要始终从内存中删除敏感数据。 通常这不是我在 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这是默认副本的副本,除非您更改了 deallocatereallocate指向您已按照默认 allocate 实现的函数的指针, reallocatedeallocate还可以调用memset适本地清除内存。

完成此操作后,安全删除就可以归结为确保这些自定义创建的 CFString对象,又名 NSString对象,在您的应用程序退出之前被释放。

您可以了解CFAllocator , CFAllocatorContextMemory Management Programming Guide for Core Foundation .

这给我们带来了您的实际问题,如何将NSData归零。你很幸运 NSData对象是 CFData对象,以及CFDataCFDataGetBytePtr ,与 CFStringGetCStringPtr 不同,保证直接从文档返回指向实际字节的指针:

This function is guaranteed to return a pointer to a CFData object's internal bytes. CFData, unlike CFString, does not hide its internal storage.

因此,请按照 CFString 的模式编写代码将在这里工作。请注意,使用 NSDatabytes文档保证调用 CFDataGetBytePtr ,例如可以调用 CFDataGetBytes并返回字节的副本,使用 CFData功能。

HTH

关于ios - OBJ-C 在无效之前删除 NSData 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51806557/

相关文章:

ios - NSProgress fractionCompleted 键值观察方法未调用

iOS 创建一个仅包含数字的动态文本字段

nsstring - 如果存在特殊字符,NSMutableData 到 NSString 的转换将失败

iphone - 将 NSNumber 转换为 16 位十六进制字符串

ios - NSString:处理基于 UTF8 的 API

ios - 将 google map.bundle 添加到项目导致 xcode 5 停止

ios - 如何使用自定义动画将一个 UI 元素替换为另一个 UI 元素?

ios - TabBarController 和导航 Controller - Swift - 登录

objective-c - 是否可以看到 Objective-C ARC 输出?

iphone - 像表格 View 单元格一样绘制游戏中心