让我尝试将您的问题分解为多个子问题/假设:
假设:
a) 钥匙串是安全的地方
事实上,这并没有那么安全。如果您的应用程序安装在越狱设备上,黑客将能够从钥匙串中获取您的密钥
问题:
a) 有没有办法将一些密钥放入应用程序(从 AppStore 提供的二进制文件)并完全安全?
简短的回答是否定的。一旦你的二进制文件中有东西,它就可以被逆向工程。
b) 混淆会有帮助吗?
是的。这将增加黑客弄清楚这一点的时间。如果您在应用程序中拥有的密钥“成本”低于逆向工程所花费的时间 - 一般来说,您就很好。
然而,在大多数情况下,通过默默无闻的安全性是不好的做法,它给你一种感觉,你是安全的,但事实并非如此。
因此,这可能是安全措施之一,但您还需要采取其他安全措施。
c) 在这种情况下我该怎么办?*
如果不了解您想要做什么的背景,就很难给您一个好的解决方案。
例如,为什么每个人都应该可以访问相同的 Amazon S3?它们需要只读还是写入(正如 Kendall Helmstetter Gein 所指出的)。
我相信最安全的场景之一是这样的:
- 您的应用程序应该受密码保护
- 第一次进入应用程序时,它会要求用户向服务器进行身份验证(输入用户名、密码)
- 这会针对您的服务器或其他身份验证提供商(例如 Google)进行身份验证
- 服务器向设备发送一些身份验证令牌(通常是某种类型的 cookie)。
- 您根据应用程序密码的哈希值加密此令牌,并将其以这种形式保存在钥匙串中
- And now you can do one of two things:
- 将特定密钥从服务器移交给客户端(因此每个客户端都有自己的密钥)并使用应用程序密码的哈希值对其进行加密
- 在服务器上处理所有与S3的操作(并需要客户端发送)
这样您就可以免受多种可能的攻击。
c) 哇...我不打算实现你刚刚写的所有这些东西,因为这需要我几个月的时间。有没有更简单的事情?
我认为如果每个客户端都有一组密钥,这会很有用。
如果这仍然太多,则从服务器下载加密密钥并将其以加密形式保存在设备上,并将解密密钥硬编码到您的应用程序中。我想说这是微创的,至少你的二进制文件中没有密钥。
附:肯德尔和罗布都是对的。
更新1(基于新信息)
首先,你见过吗应用内购买编程指南 http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/APIOverview/OverviewoftheStoreKitAPI.html#//apple_ref/doc/uid/TP40008267-CH100-SW1.
Server Product Model下有很好的图。这个模型可以防止那些没有购买新关卡的人。您的应用程序中不会嵌入亚马逊密钥,并且您的服务器端将在收到购买收据时移交级别。
没有完美的解决方案可以防止有人购买了该内容(并决定从您的应用程序中窃取该内容),因为最终您的应用程序会将内容下载到设备上,并且需要以纯格式(未加密的形式) )在某个时间点。
如果您确实担心这种情况,我建议您加密您的所有资产,并以加密形式将其与加密密钥一起从服务器移交。应为每个客户端生成加密密钥,并应使用它对资产进行加密。
这不会阻止任何高级黑客,但至少可以防止有人使用 iExplorer 并复制文件(因为它们将被加密)。
Update 2
关于更新的另一件事1.您应该存储未加密的文件并将加密密钥存储在某处(例如在钥匙串中)。
如果您的游戏需要互联网连接,最好的想法是根本不在设备上存储加密密钥。每次启动应用程序时,您都可以从服务器获取它。