2

我需要我的应用程序使用客户的电话号码为我的网络服务生成唯一 ID。当然,电话号码是唯一的,但它必须是安全的。所以它可以用对称加密来实现(非对称将在以后,因为资源泄漏),但我不知道在哪里存储加密密钥。

1.

我不知道为什么,但在代码中将键存储为静态字段似乎不好。可能是因为从这里读取它太容易了,即使不运行应用程序。

2.

将密钥存储在 Keychain 中并通过请求从此处获取似乎更好。但是为了避免#1,有必要在安装过程中安装钥匙串。是否可以?怎么做?

3.

我不知道证书是做什么的。它们对问题有帮助吗?

4.

从服务器传输密钥也是一个坏主意,因为很容易嗅探它。

4

2 回答 2

4

解决嗅探问题的方法是通过 HTTPS 为 Web 服务进行通信。NSURLConnection 很容易做到这一点,我所知道的所有 Web 服务引擎都可以毫无问题地处理 HTTPS。这将立即解决您的许多问题。

100-1000x解密瓶颈在哪台机器上?您的服务器是否太忙以至于无法进行异步解密?你应该很少在电话上这样做,以至于它应该是无关紧要的。我不是说 asym 是这里的答案。只是它的性能开销不应该是保护单个字符串的问题,解密一次。

您的服务需要短信,因此所有用户都必须提供他们的电话号码?您是在尝试自动获取电话号码,还是让用户自己输入?通过私有 API(或非私有但未记录的配置数据)自动获取电话号码并将其发送到服务器可能会违反服务条款。这是 Apple 希望保护用户免受其侵害的特定用例。您肯定需要在您的 UI 中非常清楚您正在执行此操作并获得明确的用户许可。

我个人的身份验证如下:

  • 服务器发送挑战字节
  • 客户端发送 UUID、日期和哈希(UUID+challenge+userPassword+obfuscationKey+date)。
  • 服务器计算相同,确保日期在合法范围内(30-60 秒是好的)并验证。
  • 在这一点上,我通常让服务器生成一个长的、稀疏的、随机的会话 ID,客户端可以将其用于此“会话”的剩余部分(从接下来的几分钟到下一年),而不是在每条消息中重新验证.

ObfuscationKey 是您将其硬编码到程序和服务器中的密钥,以使第三方更难创建虚假客户端。安全地确保只有您的客户端可以与您的服务器通信是不可能的,期间,不可能。然而,混淆密钥会有所帮助,尤其是在逆向工程更加困难的 iPhone 上。使用 UUID 也有帮助,因为与电话号码相比,第三方对它的了解要少得多。

注意那里的“userPassword”。用户应该使用只有用户知道的东西进行身份验证。UUID 和电话号码都不是这样的东西。

上面的系统,加上 HTTPS,应该很容易实现(我已经用多种语言做过很多次了),具有良好的性能,并且对于广泛的“适当”来说安全到适当的级别。

于 2009-05-20T13:46:47.107 回答
2

我不认为你将能够通过对称加密安全地做你想做的事。使用 asym,您可以发送公钥而无需过多担心(唯一的威胁是有人用他们自己的密钥替换您的密钥)并使用私钥验证服务器上加密的唯一 ID。

于 2009-05-20T08:54:29.227 回答