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

1.

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

2.

最好将密钥存储在钥匙串中并根据请求从这里获取它。但为了避免#1,有必要在安装过程中安装钥匙串密钥。是否可以?怎么做?

3.

我不知道证书有什么作用。它们对解决问题有帮助吗?

4.

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

有帮助吗?

解决方案

解决嗅探问题的方法是通过 HTTPS 为 Web 服务进行通信。NSURLConnection 可以轻松完成此操作,并且我所知道的所有 Web 服务引擎都可以轻松处理 HTTPS。这将立即解决您的许多问题。

100-1000x解密瓶颈在哪台机器上?您的服务器是否太忙而无法进行异步解密?您应该很少在电话上执行此操作,因此应该无关紧要。我并不是说 asym 是这里的答案;只是它的性能开销不应该成为保护单个字符串(解密一次)的问题。

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

就我个人而言,我会按如下方式进行身份验证:

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

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

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

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

其他提示

我不认为你将能够做到你想要什么安全与对称加密。随着ASYM您可以发送公钥而不用担心太多(唯一的威胁是有人代自己的密钥)和验证用私钥您的服务器上加密的唯一ID。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top