2

我需要隐藏密码才能连接服务器。问题是密码是由服务提供商提供的,所以它是静态的。

我已经考虑过使用钥匙串,但问题是即使我使用它,我也需要对密码进行硬编码以将其插入到代码中某处的钥匙串中。

那么,有没有办法隐藏我的应用程序可用的静态密码,避免在我的代码中编写它?

4

3 回答 3

1

我会考虑在您的应用程序用户和服务提供商之间设置一个中间层服务器 - 一种代理。它将允许您:

  • 为每个用户设置不同的密码
  • 可选择让用户有机会更改密码
  • 更好地控制谁使用服务以及传输什么数据
  • 更加独立于您的服务提供商(例如随时更改)

这将需要更多的努力,但从长远来看可能更有利。

于 2013-04-10T14:56:35.387 回答
1

这不是一个可解决的问题,并且已经围绕 SO 进行了详细讨论。对于一个包含指向其他几个链接的“中心”问题,请参阅Secure https encryption for iPhone app to pages

使用默默无闻并不是一件可怕的事情。但保持简单。用一些随机键对值进行异或。完毕。放置越来越多的层不会给您带来任何好处,并且会花费您的复杂性(这意味着时间和错误,它们是利润和安全性的敌人)。如果有人在您的代码上放置了调试器,他们只会记录您发送到服务器的所有数据,因此您跳过所有隐藏您如何计算密码的箍都无关紧要,因为最终您必须发送它到服务器。因此,请保持简单,以阻止人们仅使用“字符串”将其拉出,并认识到您无法停止调试器。

保护服务提供商密钥的唯一方法是将该密钥放在您的服务器上,然后在验证用户身份后代理服务。如果你把它放在代码中,那么它是可发现的,句号。如果这是一个可以解决的问题,那么就不会有未经许可的软件副本、未经许可的音乐副本、iPhone 越狱等。如果 Apple 在控制从硬件到系统的每一部分时无法停止逆向工程操作系统,你不会在应用程序中修复它。

您应该考虑的是在密钥丢失时如何恢复。你怎么发现它发生了?您如何使该密钥过期并创建一个新密钥?如果您在代码中传送密钥,您必须假设它最终会被发现,并且您应该有一个处理它的计划。

作为旁注,我过去使用的一种技术是按需从我们的服务器下载密钥,而不是在应用程序的任何地方对其进行编码。我们使用经过身份验证的 HTTPS 并检查我们的证书。当然,仍然有可能欺骗这个系统(总是有可能欺骗一个系统,它向客户提供他们只应该使用某种方式的信息),但我们的想法是至少我们可以通过这种方式更轻松地更改密钥如果钥匙泄漏,可以暂时阻止潮流。

于 2013-04-10T15:07:07.700 回答
0

这是钥匙和盒子的问题,你可以每次都把你的钥匙放在一个新的盒子里,然后把这个钥匙藏在一个新的盒子里,你可以继续这样做....但最后你总是有最后一把钥匙...而且无处可藏。

就我个人而言,我会混淆钥匙串的钥匙,并将真正的钥匙隐藏在钥匙串中。如果它是一个非常重要的秘密,您可以使用 AES 来加密您的密钥,但是您再次使用您的加密密钥,在这里您可以使用特定于设备的东西而不是硬编码值,并从该属性中生成您的密钥。

肯定不是完美的,但在大多数情况下都能胜任。

于 2013-04-10T14:51:11.500 回答