我试图隐藏在我的一个应用程序中使用的两个秘密。
据我所知,钥匙链是一个很好的地方,但我不能在提交应用程序之前添加它们。
我想过这个场景-
这是安全的吗?或者黑客可以看到发生这种情况并获得这些密钥吗?
*第三次编辑**很抱歉没有从一开始就解释这个场景-应用程序有很多级别,每个级别都包含文件(音频,视频,图像)。用户可以购买一个级别(IAP),在购买完成后,我需要将文件下载到他的设备上。
对于iOS6,这些文件是用苹果新的“托管内容”功能存储的。对于亚马逊,这些文件存储在iOS5 S3中。
所以在所有这个过程中,我有两个密钥: 1. IAP密钥,用于在Apple IAP验证购买。2. S3密钥,用于为iOS5用户从S3获取文件:
NSString *secretAccessKey = @"xxxxxxxxx";
NSString *accessKey = @"xxxxxxxxx";
我需要保护这些钥匙吗?我担心人们将能够在没有购买级别的情况下从S3获得文件。或者,黑客将能够构建一个黑客版本,其中所有级别都已预先下载。
发布于 2013-02-14 08:12:54
让我尝试将您的问题分解为多个子问题/假设:
假设:
a)钥匙串是安全的地方
实际上,这并不是那么安全。如果您的应用程序安装在jailbroked设备上,黑客将能够从密钥链中获取您的密钥
问题:
a)有没有一种方法可以把一些密钥放入一个应用程序(由AppStore提供的二进制文件)中,并且是完全安全的?
简短的回答是否定的。一旦你的二进制文件中有了什么东西,它就可以被逆向工程。
b)混淆会有帮助吗?
是。这会增加黑客找出问题的时间。如果你在应用程序中拥有的密钥“花费”比在逆向工程上花费的时间更少-通常来说,你是好的。
然而,在大多数情况下,默默无闻的安全性是一种糟糕的做法,它会给你一种安全的感觉,但事实并非如此。
因此,这可能是一种安全措施,但您还需要有其他安全措施。
c)遇到这种情况该怎么办?*
如果不知道你想要做什么,就很难给你一个好的解决方案。
例如,为什么每个人都应该访问相同的亚马逊S3?它们是否需要只读或写入(正如Kendall Helmstetter Gein所指出的)。
我认为最安全的场景之一是这样的:
H222< >H121
将特定密钥从服务器移交给客户端(因此每个客户端都将拥有自己的密钥),并使用您的应用程序passcodeH222<的哈希对其进行加密/code>
在服务器上使用S3处理所有操作(并且需要客户端到send)
这样可以保护您免受多个可能的攻击。
c)哇……我不打算实现你刚刚写的所有这些东西,因为这将花费我几个月的时间。还有没有更简单的?
如果每个客户端都有一组密钥,我认为这会很有用。
如果这太多了,那么从服务器下载加密密钥,并将它们以加密形式保存在设备上,并将解密密钥硬编码到您的应用程序中。我想说它是微创的,至少你的二进制文件中没有密钥。
另外,肯德尔和罗伯都是对的。
更新1(基于新信息)
首先你见过
in app purchase programming guide
吗。
在服务器产品模型下有很好的绘图。这个模型可以保护那些没有购买新关卡的人。您的应用程序中将不会嵌入amazon密钥,您的服务器端将在收到购买收据时移交级别。
没有完美的解决方案来防止购买内容的人(并决定从您的应用程序中窃取它),因为到最后,您的应用程序将把内容下载到设备上,并在某个时候需要它的明文(未加密形式)。
如果你真的关心这种情况,我建议加密你所有的资产,并将其与加密密钥一起以加密的形式从服务器上交。应该为每个客户端生成加密密钥,并使用它对资产进行加密。
这不能阻止任何高级黑客,但至少它可以防止有人使用iExplorer和只是复制文件(因为它们将被加密)。
更新2
关于更新1还有一件事。你应该存储未加密的文件,并将加密密钥存储在某个地方(例如,在keychain中)。
如果你的游戏需要互联网连接,最好的办法是根本不在设备上存储加密密钥。每次启动应用程序时,您都可以从服务器获取它。
发布于 2013-02-14 07:27:15
请勿在您的应用程序中存储用于写入的S3密钥!在很短的时间内,嗅探流量的人将看到对S3的写调用,在较短的时间内,他们将找到那个键并做他们喜欢的任何事情。
应用程序能够以任何程度的安全性将内容写入S3的唯一方法是通过您控制的服务器。
如果它是一个只读使用的密钥,这意味着你的S3不能被公开读取,但是这个密钥可以用于只读访问,没有写的能力,那么你可以把它嵌入到应用程序中,但是任何想要把它拉出来的人都可以把它拉出来。
为了稍微遮蔽预先加载的敏感数据,您可以将其加密到一个文件中,应用程序可以将其读取到内存中,并在存储到密钥链中之前解密。再说一次,有些人将能够获得这些密钥,所以如果他们可以的话,最好不要太在意。
编辑:
根据新的信息,您可能会更好地将秘密嵌入代码中。使用像iExplorer这样的工具,因果用户可以很容易地访问核心数据数据库或应用程序包中的任何其他内容,但是对象文件在某种程度上是加密的。如果他们有越狱设备,他们可以很容易地获得未加密的版本,但仍然很难找到有意义的字符串,也许将它们分成两部分存储并在代码中重新组装。
再说一次,它不会阻止一个有决心的黑客,但它足以阻止大多数人。
您可能还想添加一些代码,这些代码会尝试询问您的服务器是否有任何可以下载的覆盖秘密。这样,如果秘密被泄露,你可以通过更改应用程序使用的秘密来快速做出反应,同时将使用复制秘密的任何人拒之门外。首先,将不会有覆盖下载。您不希望必须等待应用程序更新才能使用新密钥。
发布于 2013-02-14 07:10:34
没有好的方法来隐藏你发送给攻击者的一段代码中的秘密。与大多数这种类型的事情一样,您需要更多地关注如何在密钥泄漏时缓解问题,而不是花费无限的时间试图保护它。例如,为每个用户生成不同的密钥允许您在密钥被滥用时禁用该密钥。或者,通过中间服务器工作可以让您控制协议(即,服务器拥有密钥,并且只愿意用它做某些事情)。
做一点模糊处理并不是浪费时间。这很好。但是不要在上面花太多的时间。如果它在程序中,并且非常有价值,那么它就会被黑客破解。将重点放在如何检测何时发生,以及如何在发生时恢复。并且尽可能地将这种敏感数据移动到您控制的其他服务器中。
https://stackoverflow.com/questions/14778429
复制相似问题