在iOS中,如何存储允许我与服务器通信的秘密“密钥”?

时间:2015-04-20 23:27:15

标签: ios swift

我想存储一个秘密密钥(“abc123”),我将在我的REST API请求的标头中使用它。我的服务器将检查此密钥。如果它匹配“abc123”,则允许发出请求。

我正在考虑一个简单的解决方案,如:

let secret = "abc123" 

但这会不会有任何挫折?

6 个答案:

答案 0 :(得分:21)

听起来很疯狂,这可能是最好的解决方案。其他一切都比较复杂,但不太安全。您使用的任何花哨的混淆技术都将被反向设计,几乎与他们找到此密钥一样快。但是这种静态密钥解决方案虽然非常不安全,但几乎与其他解决方案一样安全,同时几乎没有额外的复杂性。我喜欢它。

它几乎会立即被打破,但所有其他解决方案也将如此。所以保持简单。

您真正想要做的一件事是使用HTTPS和pin your certificates。我选择一个不长的随机密钥,这不是一个单词。理想情况下,它应该是一个完全随机的字节串,存储为原始值(而不是字符),因此它在二进制文件中显然不那么突出。如果你想变得疯狂,请在发送之前对其应用SHA256(因此实际的密钥永远不会显示在你的二进制文件中)。同样,这很容易打破,但它很容易,并且不会浪费很多时间来开发。

超过一小时的任何努力都不太可能值得实施此功能。如果您对该主题有更多了解,请参阅Secure https encryption for iPhone app to webpage及其链接。

答案 1 :(得分:6)

通过在您的应用中对字符串进行硬编码,攻击者可以解密您的二进制文件(通过dumpdecrypt等工具)并轻松获取字符串(简单的hexdump将包含您应用中的任何字符串)。< / p>

这有一些解决方法。您可以在REST API上实现一个端点,该端点返回您的凭据,然后您可以在启动时调用。当然,这有其非常重要的安全问题,需要额外的HTTP调用。我通常不会这样做。

另一种选择是以某种方式混淆密钥。通过这样做,攻击者将无法在解密后立即识别您的密钥。 cocoapods-keys是使用此方法的一种选择。

这里没有完美的解决方案 - 你可以做的最好的事情就是让攻击者尽可能地抓住你的钥匙。

(另外,请务必在发送请求时使用HTTPS,否则这是破坏密钥的另一种好方法。)

答案 2 :(得分:2)

虽然带内令牌通常用于某些方案,但您最终可能会实施TLS来保护网络流量和令牌。 This as Rob Napier mentions in another reply

在此处使用您自己的证书链允许使用现有的TLS安全和身份验证机制以及iOS钥匙串,并且还可以选择在必要时(何时?)撤销TLS凭据,并允许客户端销它与服务器的连接,并在必要时检测服务器欺骗。

您自己的证书颁发机构和您自己的证书链是免费的,您自己的证书 - 一旦您获得加载到客户端的根证书 - 就像商业购买的证书一样安全。

简而言之,这种基于证书的方法使用现有的TLS机制结合了加密和身份验证。

答案 3 :(得分:0)

看起来您正在使用访问令牌。我会使用Keychain来访问令牌。对于客户ID,我只是将它们保存为变量,因为客户ID不会在访问令牌每个用户更改时发生变化,甚至每个刷新令牌和钥匙串都是存储用户凭据的安全位置。

答案 4 :(得分:0)

我使用了PFConfig对象(字典),它允许您在应用程序中检索存储为服务器环境参数的变量值。
类似于可以使用ENV在网站服务器端编程(如Ruby或PHP)中检索的环境变量。 在我看来,这与使用Ruby或类似的环境变量一样安全。

PFConfig.getConfigInBackgroundWithBlock{
      (config: PFConfig?, error: NSError?) -> Void in
      if error == nil {
        if let mySecret = config["mySecret"] as? String {
          // myFunction(mySecret)
        }

    }

答案 5 :(得分:-4)

如果你这样存储,如果有人对你的应用程序发脾气,他/她可以访问你的密钥。我建议您现在开始将您的秘密存储为#define或用户默认值(这样您就可以先构建您的应用),一旦您接近应用提交,请使用钥匙串Here is an example answer