iphone - 在应用程序安装过程中将加密 key 存储在钥匙串(keychain)中

标签 iphone objective-c security certificate keychain

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

1.

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

2.

最好将 key 存储在钥匙串(keychain)中并通过请求从这里获取它。但为了避免#1,有必要在安装过程中安装钥匙串(keychain) key 。是否可以?如何做到这一点?

3.

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

4.

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

最佳答案

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

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

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

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

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

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

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

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

关于iphone - 在应用程序安装过程中将加密 key 存储在钥匙串(keychain)中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/886893/

相关文章:

security - 在不强制重定向到 HTTPS 的情况下启用 HSTS?

iphone - 初始化程序、属性、访问器和复制/保留/只读

iphone - 从应用程序内发送崩溃报告

iphone - 应用程序在前台时的 UILocalNotifications

objective-c - Swift 2.0 与 Objective C 的互操作没有按预期工作?

javascript - 验证用 Phonegap(或等效)包装的 HTML5 应用程序

ios - 如何检查 UIView 是否超出其父 View 范围

iphone - 应用程序未通过协同设计验证。 (-19011)

ios - 使用 AVAssetImageGenerator 的 copyCGImageAtTime 为 Assets 的特定帧抛出 -11800 未知错误

security - OpenId Connect 如何保护资源服务器免受客户端模拟?