iOS App场景下的安全密钥,安全吗?

2024-01-12

我试图隐藏我在一个应用程序中使用的 2 个秘密。

据我了解,钥匙串是一个好地方,但在提交应用程序之前我无法添加它们。

我想到了这个场景——

  • 通过将秘密传播到其他实体中以掩盖它们,将秘密预先播种到我的应用程序的 CoreData 数据库中。 (我在该应用程序中已经有一个种子数据库)。
  • 当应用程序首次启动时,生成密钥并将其移动到钥匙串。
  • 从 CoreData 中删除记录。

这安全吗?或者黑客可以看到这种情况的发生并获取这些密钥吗?

*第三次编辑** 抱歉没有从一开始就解释这个场景 - 该应用程序有很多级别,每个级别都包含文件(音频、视频、图像)。用户可以购买关卡(IAP),购买完成后我需要将文件下载到他的设备上。

对于 iOS6,文件通过 Apple 新的“托管内容”功能进行存储。对于 iOS5,文件存储在 amazon S3 中。

所以在整个过程中我有两个关键: 1. IAP 密钥,用于验证 Apple IAP 购买。 2. S3密钥,用于iOS5用户从S3获取文件:

NSString *secretAccessKey = @"xxxxxxxxx";
NSString *accessKey = @"xxxxxxxxx";

我是否需要保护这些密钥?我担心人们无需购买关卡就能从 S3 获取文件。或者黑客将能够构建一个破解版本,其中预下载了所有级别。


让我尝试将您的问题分解为多个子问题/假设:

假设:

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.您应该存储未加密的文件并将加密密钥存储在某处(例如在钥匙串中)。

如果您的游戏需要互联网连接,最好的想法是根本不在设备上存储加密密钥。每次启动应用程序时,您都可以从服务器获取它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS App场景下的安全密钥,安全吗? 的相关文章

随机推荐