gpt4 book ai didi

ios - OBJ-C 在取消它之前删除 NSData 内容

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:20:53 26 4
gpt4 key购买 nike

出于安全原因,我们需要始终从内存中删除敏感数据。通常这不是我在 IOS 中看到的事情,但对于需要扩展安全性的应用程序来说,这是非常重要的。

如果 NSData 和 NSString 对象通常需要删除数据(指向 nil 不会删除数据,这是一个安全漏洞)

我已经成功地用下面的代码删除我的 NSStrings(当密码是 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'

我找不到一个解决方法来指向密码地址并删除那里的字节,就像我对字符串所做的那样(字节方法应该让我按照我的理解来做,但由于某种原因它没有编译我想不通)

有人对此有想法吗?

10倍

最佳答案

您的字符串释放器脆弱。你写:

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)保证您可以直接访问其内部缓冲区。你没有说你是如何处理这种情况的,但如果你不删除内存,你可能会遇到安全问题。

如果你确实得到了一个有效的指针,你使用了错误的字节数。调用 [密码长度] 返回:

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,它将返回系统使用的函数指针。然后,您可以根据 CFAllocatorContext 创建一个新的 CFAllocator,它是默认值的副本,只是您更改了 deallocatereallocate 指向您根据默认 allocatereallocatedeallocate 实现的函数的指针,但也调用 memset 适本地清除内存。

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

你可以在Memory Management Programming Guide for Core Foundation中找到关于CFAllocatorCFAllocatorContext等的信息。 .

这让我们想到了您的实际问题,如何将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com