在应用程序安装过程中将加密密钥存储在Keychain中

时间:2009-05-20 08:49:18

标签: iphone objective-c security certificate keychain

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

1

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

2

最好将钥匙存放在钥匙串中,并通过请求从此处获取钥匙。但是为了避免#1,必须在安装过程中将钥匙安装到钥匙串上。可能吗?怎么做?

3

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

4

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

2 个答案:

答案 0 :(得分:4)

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

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

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

我个人认证如下:

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

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

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

上面的系统,加上HTTPS,应该很容易实现(我已经在很多语言中多次完成),具有良好的性能,并且在适当的范围内保持适当的安全性。

答案 1 :(得分:2)

我认为您无法通过对称加密安全地执行您想要的操作。使用asym,您可以发送公钥而不必担心太多(仅威胁是用自己的密钥替换您的密钥)并使用私钥验证服务器上的加密唯一ID。