在iOS中,我怎么能存储一个秘密的“钥匙”,这将允许我与我的服务器通信?

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

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

let secret = "abc123" 

但是会有什么倒台呢?

听起来很疯狂,这可能是最好的解决scheme。 其他一切都比较复杂,但不是更安全。 你所使用的任何奇特的混淆技术都将被反向devise,几乎和他们find这个关键一样快。 但是,这种静态的关键解决scheme虽然非常不安全,但几乎与其他解决scheme一样安全,同时几乎没有额外的复杂性。 我喜欢它。

它会立即被打破,但所有其他的解决scheme也会被打破。 所以保持简单。

你真正想在这里做的一件事是使用HTTPS并钉住你的证书 。 而且我会select一个不是一个字的随机的长键。 理想情况下,它应该是一个完全随机的字节串,以原始值(而不是字符)的forms存储,这样在二进制文件中就不会那么明显。 如果你想疯了,在发送之前应用一个SHA256(所以实际的密钥从不会在你的二进制文件中出现)。 再次,这是微不足道的打破,但它很容易,不会浪费很多时间发展。

任何超过一个小时的努力都不可能实现这个function。 如果您想了解更多的话题,请参阅将https应用encryption为iPhone应用到网页及其链接。

通过对应用程序中的string进行硬编码,攻击者可以通过dumpdecrypt等工具对您的二进制文件进行解密,并且可以毫不费力地获得您的string(一个简单的hexdump将包含应用程序中的任何string)。

这有几个解决方法。 您可以在您的REST API上实现一个terminal,它将返回您的凭证,然后您可以调用启动。 当然,这有它自己的不平凡的安全问题,并需要额外的HTTP调用。 我通常会这样做。

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

这里没有完美的解决scheme – 最好的办法就是让攻击者尽可能地难以掌握你的密钥。

(另外,请确保在发送请求时使用HTTPS,否则这是妥协您的密钥的另一种好方法。)

虽然带内令牌通常用于某些scheme,但您最终可能会实施TLS来保护networkingstream量和令牌。 罗布·纳皮尔(Rob Napier)在另一个答复中提到 。

在这里使用自己的证书链允许使用现有的TLS安全和身份validation机制以及iOS钥匙串,并且还允许在需要时(如果?)撤销TLS证书,还允许客户端将其连接连接到你的服务器和检测服务器欺骗,如果这是必要的。

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

简而言之,这种基于证书的方法结合了encryption和authentication,使用现有的TLS机制。

它看起来像你正在使用访问令牌。 我会使用钥匙链访问令牌。 对于客户端ID,我只是将它们保留为variables,因为客户端ID不会更改,而访问令牌每个用户更改,甚至每个刷新令牌,钥匙串是存储用户凭据的安全位置。

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

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

如果你这样保存,如果有人用你的应用程序发脾气,他/她可以获得你的密钥。 我build议你现在开始将你的秘密存储为#define或用户默认(所以你可以先build立你的应用程序),一旦你接近应用程序提交,使用keychain 下面是一个示例答案