NSUserDefaults存在哪些不安全性问题,手动加密是否安全?

9

如果我理解正确:NSUserDefaults是一个不安全的地方来存储敏感数据,因为某些设置文件可以被黑客攻击并且NSUserDefault的值可以被更改。

究竟什么可以被黑客攻击而什么不可以?黑客能否看到我的应用程序的Swift代码,还是他们只能看到存储在NSUserDefaults中的变量和值列表?

我能否在我的代码中创建自己的“加密”(其中NSUserDefault的值看起来像一堆无意义的数字,而“密钥”在我的代码中具有一些错综复杂的数学操作)?这是安全的吗?

注意:我不打算加密任何重要的用户名或密码,只是高分和布尔值(用于判断是否解锁了关卡/升级)。如果我的手动解决方案是安全的,我就不想学习KeychainsWrappers。

附带问题(虽然我还没有达到这一步):应用内购买如何处理?是否有一个布尔值表示物品是否已付款以及该布尔值存储在哪里(由您决定)?

2个回答

13

什么可以被黑进去,什么不能?

几乎所有的事情都可以被黑进去。

黑客能看到我的应用程序Swift代码吗?他们只能看到变量列表吗?

一个高级黑客可以看到可执行二进制文件但无法看到Swift源代码。

存储在NSUserDefaults中的值?

查看NSUserDefaults的内容非常容易。参见iExplorer和其他类似的应用程序。

我可以在我的代码中创建自己的“加密”吗?

当然可以,但是你应该这样做吗?

“Schneier的法则”:“任何人,从最愚蠢的业余者到最好的密码学家,都可以创建他自己无法破解的算法。”

这个方法安全吗?

不安全。如果想使用加密,需要使用标准加密算法(例如AES),但是创建一个安全的方案并不容易。可以使用一个封装库,如RNCryptor。但这会产生一个新问题:在哪里安全地保存加密密钥,参见下一个点。

如果我的手动方案是安全的,我就不想学习KeychainsWrappers。

只有当您需要安全地保存密钥和少量数据时才需要学习KeychainsWrappers。安全很难。

您需要评估所需的安全级别,包括攻击者的级别和数据的价值。攻击者从好奇的学生到国家级都有可能。数据价值从井字游戏最高分到核武器细节。首先需要确定这些内容。


2
NSUserDefaults只是存储在设备文件系统中的一个plist。它唯一的“安全性”是人们必须进入设备文件系统才能访问它,这并不特别困难。
根据苹果关于应用内购买的文档:
“在使产品可用之后,您的应用程序需要对购买进行持久记录。” source 您可以在有关持久保存购买信息的部分阅读更多信息,但请忽略其中提到可以使用用户默认值的部分。
此外,如果您不知道自己在做什么,我永远不能建议您自己编写安全存储系统。
以上是假设你正在谈论应用内购买。如果你谈论的是用户本地的内容,那么他们是否黑掉你的应用真的很重要吗?假设你有一个系统,必须打败前一关才能解锁下一关。如果有人编辑默认设置以解锁下一关,真的有什么关系吗?这不是他们必须支付的东西,所以它不会影响你的收入流。事实上,我认为只要不影响你的收入或其他玩家,允许那些真正想作弊的人这样做更好。

能看到代码怎么样,那是不可能的吧?我不是在寻求建议,我想知道标准黑客的能力。如果他们不能看到我的代码,我有信心设计出一些烦人且无法被破解的东西来防止高分作弊。 - mdamkani
我以为你正在防止应用内购的篡改。我并没有真正看到任何理由去防止本地高分数的篡改。 - Will M.
什么是“标准黑客”?您需要评估所需的安全级别,包括攻击者的级别和数据的价值。 - zaph
2
如果学习Keychain是一道难题,我向您保证,如果攻击者有特定的动机,您无法想出足够坚不可摧的东西来防止高分篡改。(在一般情况下,防止高分篡改是微不足道的;只需制作一个没有人关心的游戏即可。)如果您能在没有安全背景的情况下完成它,那么大多数流行的游戏就不会有欺诈性的高分。大多数流行的游戏确实存在欺诈性的高分。这本身就说明这不是一个简单的问题。 - Rob Napier
2
这并不是要阻止你建立一个像你描述的简单混淆系统。事实上,我鼓励你这样做。这正是你应该做的。它不会特别有效,但只要保持简单,它就不会对你的程序造成任何伤害,并且它会有一点效果。只是不要浪费大量时间和精力去尝试制作真正有效的东西。这很少值得,而且你需要一个非常庞大和持续的预算来不断改进它,因为它被打败了。 - Rob Napier
关于应用内购买,我曾认为这是苹果跟踪的信息。现在我明白了这取决于我自己,看起来我最终必须实现钥匙串包装器。对于不太重要的东西,我会先从一些自定义和不完美的东西开始。谢谢。 - mdamkani

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