解决嗅探问题的方法是通过 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,应该很容易实现(我已经用多种语言做过很多次了),具有良好的性能,并且对于广泛的“适当”来说安全到适当的级别。