有没有比使用plist保存应用内购买更安全的解决方案?

时间:2011-01-17 06:52:28

标签: iphone nsuserdefaults in-app-purchase

我正在使用应用内购买构建iPhone应用。我正在使用“内置”模型,其中附加内容在验证收据后解锁。我的交易没有问题......但是在用户设备上保存购买记录的最佳方法是什么?

Apple指南建议使用NSUserDefaults存储该信息。这个建议的问题是任何拥有iPhone Explorer免费副本的人都可以非常轻松地进入应用程序,编辑plist,并在不实际支付的情况下解锁完整版本。

有人可以推荐更安全的解决方案吗?

2 个答案:

答案 0 :(得分:6)

标准免责声明:这里没有“真正的解决方案”可以打败所有盗版 - 免费解锁东西只有不同程度的难度。目前的传统观点:担心知道如何编辑app plists的少数人可能并不重要。

反正:

  1. 您可以将这些数据存储在(例如)应用程序文件系统中持久存在的任何位置。除了~/tmp之外,它位于/Library/Caches以下的任何位置。您可以使用通常隐藏在普通目录列表中的句点前缀文件名。
  2. 你可以用某种格式将它存储在钥匙串中,这对于你正在做的事情来说不一定更安全,但却是一个相当模糊的地方来保持旗帜。
  3. 在上述任何一种情况下,您都可以使用嵌入应用程序二进制文件中的密钥对该标志进行签名。如果我要达到这个程度,我会将设备的唯一ID与标志的值(YES)或您需要的任何其他ID字符串连接起来,然后使用您生成并保持混淆的16byte密钥的SHA-HMAC你的二进制。
  4. 大部分可能都是矫枉过正,请参见顶部的免责声明。 :)

答案 1 :(得分:0)

我认为最安全的方法是将此信息存储在您的服务器上,并在应用程序启动期间加载此信息。 plist文件可以很容易地修改(它们在一天结束时是纯文本文件)

但是,如果您没有后端,仅为此目的设置后端将是矫枉过正。在这种情况下,我可以建议用plist文件做一些聪明的事情。最重要的是,拥有一个唯一的键值对,根据用户的ID授予访问权限(请记住,如果同一用户使用多个设备,设备ID将会中断)。该值将根据散列算法生成。 (例如,value = hash(userID))由于'黑客'不会知道您的算法,因此他们知道正确值(表示购买的价值)的唯一方法是购买您的应用。需要注意的是,如果您使用此订阅,黑客可能会订阅第一个月,获得正确的值,然后取消订阅并保持其正确的值。

有意义吗?