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