2013-02-08 233 views
19

我想隐藏我在其中一个应用中使用的两个秘密。iOS应用场景中的安全密钥,安全吗?

据我所知钥匙扣是一个好地方,但我不能在我提交应用程序之前添加它们。在其他实体传播他们掩盖他们

  • 预种子的秘密,在我的应用程序的CoreData数据库 -

    我想到了这个场景。 (我已经在该应用程序中有一个种子数据库)。

  • 随着应用程序第一次启动,生成并移动到钥匙串的钥匙。
  • 从CoreData中删除记录。

这是安全的还是黑客能够看到这种情况并获得这些密钥?

*第三次编辑** 对不起,从一开始就不解释这种情况 - 应用程序有很多层次,每个级别包含文件(音频,视频,图像)。用户可以购买一个级别(IAP),购买完成后我需要将文件下载到他的设备。

对于iOS6的文件存储与苹果新的“托管内容”功能。对于iOS5,这些文件存储在亚马逊S3中。

所以在这一切的过程中,我有2个按键: 1. IAP键,用于验证在苹果IAP购买。 2. S3键,用于获取从S3的文件iOS5的用户:

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

我需要保护这些钥匙呢?我担心人们能够从S3购买文件而不购买关卡。或者黑客将能够构建一个内部预先下载的所有级别的黑客版本。

+0

秘密被使用的方式是什么?它是用于客户端和服务器之间的通信吗?将文件安全地存储在设备上?了解确定事物的原因可以帮助建议实现它的最佳方法。 – WDUK 2013-02-13 18:29:53

+0

@WDUK添加的数据 – shannoga 2013-02-13 20:35:42

+0

您是否需要在_WHY_上添加更多信息以保护这些S3密钥?我是否正确理解您希望这些文件只能由您的应用的用户访问?你是否通过IAP销售这些文件,并担心人们会下载并开始使用它们而无需付费? – 2013-02-15 17:32:25

回答

38

让我试试你的问题分解成多个子问题/假设:

假设:

一)钥匙扣是安全的地方

其实,这不是安全的。如果您的应用程序安装jailbroked设备上,黑客将能够从钥匙串获取你的钥匙

问题:

一)有没有把一些关键到一个应用程序(二进制的方式被传递形成AppStore)并且完全安全?

简短回答是否。只要你的二进制文件中有东西,它就可能被反向设计。

b)混淆会有帮助吗?

是的。它会增加黑客的时间来解决问题。如果您在应用程序中使用的密钥“花费”的时间少于逆向工程的时间 - 一般而言,您会很好。

但是,在大多数情况下,通过默默无闻的安全措施是不好的做法,它会让你感觉你是安全的,但你不是。

因此,这可能是安全措施之一,但您也需要采取其他安全措施。

三)我应该在这种情况下怎么办?*

很难给你不知道的背景你正在尝试做一个很好的解决方案。

例如,为什么每个人都应该访问相同的Amazon S3?他们是否需要只读或写入(正如Kendall Helmstetter Gein指出的那样)。

我认为最安全的方案之一是类似的东西:

  • 您的应用程序应该是密码保护
  • 你输入你的应用程序要求用户进行身份验证(输入自己的用户名第一次,密码)到服务器
  • 这对您的服务器或其他身份验证提供程序进行身份验证(例如Google)
  • 服务器向设备发送一些身份验证令牌(通常它是某种类型的cookie)。
  • 您加密此令牌根据您的应用程序密码的哈希值,并将其保存在钥匙串以这种形式
  • 现在你可以做两件事情之一:
    • 手在从服务器到客户端专用键(所以每个客户都会有自己的密钥),并将其与您的应用程序密码
    • 手柄与S3服务器上的所有操作的散列加密(并要求客户端发送)

这种方式从多个可能的攻击你的保护。

C)Whoooa ....我不打算实现所有的这些东西,你只是写,因为它会带我几个月。有什么更简单的吗?

我认为这将是有益的,如果你有一组每个客户端密钥。

如果连这实在是太多了,然后从服务器下载加密密钥,并将它们以加密形式保存在设备上,有解密密钥硬编码到您的应用程序。我会说这是微创,至少你的二进制文件没有键。

P.S.肯德尔和罗布都是对的。

更新1(基于新的信息)

首先,你见过in app purchase programming guide

有在服务器产品型号非常好图纸。这种模式可以防止不买新水平的人。将有嵌入到你的应用程序和服务器端将移交级别时,它会收到购买收据没有亚马逊的钥匙。

没有完美的解决方案来防止购买内容的人(并决定从应用程序中删除它),因为在最后几天,应用程序将把内容下载到设备并需要它在某个时间点是简单的(未加密的形式)。

在这种情况下,如果你真的关心这种情况下,我会推荐给所有的资产,并交出其从服务器连同加密密钥加密加密形式。应该为每个客户端生成加密密钥,并且应该使用该加密密钥对其进行加密。

这不会阻止任何先进的黑客,但它至少会从别人使用IEXPLORER,只是复制文件(因为它们将被加密)保护。

更新2

一两件事有关更新1.你应该存储文件加密和存储加密密钥的地方(如实例钥匙圈)。

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

+0

Roninn - 编辑我的问题 – shannoga 2013-02-14 06:56:03

+0

2shannoga:请参见更新答案 – 2013-02-16 17:31:55

+0

@shannoga:我写了更新2 – 2013-02-16 20:25:22

4

有隐藏在一段代码秘密你把你的攻击没有什么好办法。与大多数此类事物一样,您需要更多地关注如何在密钥泄漏时缓解问题,而不是花费无限时间来保护密钥。例如,为每个用户生成不同的密钥允许您在滥用密钥的情况下禁用密钥。或者通过中介服务器进行工作,可以控制协议(即服务器拥有密钥并只愿意对其执行某些操作)。

这不是时间做一些混淆一种浪费。没关系。但不要花太多时间在它上面。如果它在程序中并且非常有价值,那么它将被黑掉。关注如何检测何时发生,以及如何恢复。尽可能将这种敏感数据移入您控制的其他服务器。

8

请勿店在您的应用程序,用于写的S3键!简而言之,有人嗅探流量会看到对S3的写入调用,按照更短的顺序,他们将找到该密钥并执行任何他们喜欢的操作。

唯一的方式提出申请,可以写的内容与安全的任何程度S3 IS通过自己控制的服务器去。

如果它是一个用于只读的密钥,这意味着你的S3不能被公开读取,但是密钥可以用于只读访问而无法写入,那么你可以将它嵌入到应用程序中,但任何人都想要可以把它拉出来。

要轻轻掩盖预先加载的敏感数据,您可以在文件中对其进行加密,应用程序可以将其读入内存并在存储到钥匙串中之前进行解密。再次,有人能够得到这些钥匙,所以如果可以的话,最好不要紧。

编辑:

基于新的信息,你可能会更好过只是嵌入的秘密代码。使用像iExplorer这样的工具,因果用户可以轻松地访问核心数据库或应用程序包中的其他任何内容,但目标文件有点加密。如果他们有越狱设备,他们可以轻松获得未加密的版本,但仍然很难找到有意义的字符串,可能将它们存储在两部分中,然后重新组装成代码。

再一次,它不会阻止一个坚定的黑客,但它足以让大多数人不在。

您可能还想添加一些代码,试图询问您的服务器是否存在任何可以下载的覆盖秘密。这样,如果秘密泄露,您可以通过更改用于您的应用的秘密快速做出反应,同时关闭任何使用复制秘密的人。首先,不会覆盖下载。您不希望必须等待应用程序更新才能使用新密钥。

+0

编辑我的问题 – shannoga 2013-02-14 06:56:32