如何保护NSUserDefaults?

时间:2009-10-13 15:01:22

标签: iphone

Apple建议使用NSUserDefaults存储您的所有应用偏好设置。但是,似乎NSUserDefaults很容易编辑。有没有办法确保这一点。我不是在寻找一种方法来让它无法编辑,只是让它变得更难以使用户不会那么想改变应用程序内部变量。

7 个答案:

答案 0 :(得分:22)

如果某个数据不敏感(例如,默认字体大小),请将其存储在NSUserDefaults中。

如果需要保护其免受随意监听(例如,用户密码),请将其存储在钥匙串中。

如果需要保护用户安全(例如注册码),则需要自行加密,然后将数据存储在任何地方。

答案 1 :(得分:9)

为了这个目的,我写了一个简单易用的小类别。适用于iPhone和Mac OS X,它是免费的并且在MIT许可下。你可以在github找到它:SecureUserDefaults

答案 2 :(得分:4)

您可以在iPhone Keychain中存储真正安全的数据。替代方案是您自己的加密类(可能限制应用程序分发),或通过其他编码(如nsdata,base64等)进行模糊处理。

答案 3 :(得分:4)

NSUserDefaults应该只包含您希望用户能够更改的设置。应用程序内部数据不应位于NSUserDefaults中。将内部数据保存在NSDictionary中,并将其写入应用程序文档或tmp文件夹中的单独文件。

NSDictionary* dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys];
BOOL succeeded = [dict writeToFile:[self dbFullPathName] atomically:YES];

答案 4 :(得分:2)

使用AES等加密算法加密存储在NSUserDefaults中的数据。保持加密密钥嵌入您的应用程序中,无论是硬编码还是使用多个元素的连续操作计算,都可以成功阻止对您存储的值的任何编辑主动性。为了简化操作,您应该编写一个包装方法,该方法接受明文键和值,加密它们,然后将它们存储在NSUserDefaults中,当然,在读取值时反向执行相同的操作。但请注意,考虑到加密/解密的时间,这将比不安全的存储慢,因此请考虑将该技术仅应用于应用程序的最敏感配置选项。

答案 5 :(得分:0)

说实话,这似乎不是一个问题,除非你想在NSUserDefaults中存储一些应该对用户保密的东西。用户并没有真正进入他们的偏好并直接编辑它们,除非隐藏在其中的某些内容无法通过UI进行更改(如隐藏的偏好,Apple不会为您提供更改的UI,但这些是真实的,如果改变,稳定,有用的效果。)

答案 6 :(得分:-1)

对于iPhone?他们不能改变这些变量,没有Terminal.app来改变这个(除了越狱设备,但这对Apple来说是个问题,不适合你)。对于桌面应用程序,您可以使用NSData对其进行编码,它们将作为base 64存档。