Ios 保护HTTP请求中的API密钥

Ios 保护HTTP请求中的API密钥,ios,security,ssl,translate,api-key,Ios,Security,Ssl,Translate,Api Key,经过一天的SSL和HTTPS搜索,我完全不知道如何做一些非常简单的事情。我有一个没有用户身份验证的小应用程序。所有用户都可以看到一个简单的应用程序 我正试图使用谷歌翻译API为这一点。我有一个TranslateAPI密钥,但我完全不知道如何保护它。我想直接从我的iOS应用程序调用Google translate,根据api文档(),apiKey作为请求参数“key”提供。API文档还说Google translate支持SSL,但显然我没有在我的ios应用程序上进行任何类型的SSL检查以确认身份

经过一天的SSL和HTTPS搜索,我完全不知道如何做一些非常简单的事情。我有一个没有用户身份验证的小应用程序。所有用户都可以看到一个简单的应用程序

我正试图使用谷歌翻译API为这一点。我有一个TranslateAPI密钥,但我完全不知道如何保护它。我想直接从我的iOS应用程序调用Google translate,根据api文档(),apiKey作为请求参数“key”提供。API文档还说Google translate支持SSL,但显然我没有在我的ios应用程序上进行任何类型的SSL检查以确认身份。我的问题是,如何阻止可以获取并滥用我的translate API密钥的MITM攻击?我尝试使用Charles,我清楚地看到钥匙正在通过

我在互联网上读到的每一个资源都说他们使用SSL,这一切都很好。但没有关于如何在使用流行服务(如谷歌)的iOS应用程序中使用SSL的例子

有什么办法可以让我提出这个简单的GET请求并防止我的钥匙被盗

编辑:


SSL固定在这方面是一种过分的做法。我没有考虑使用SSL,但我不知道它如何与iOS和Google这样的实体(根据下面与@pvg的讨论)配合使用。

您尝试使用HTTPS,因为您不希望人们拥有您的API密钥。如果你的应用程序直接连接到Google Translate,你有没有想过API密钥会存储在哪里

你必须将你的API密钥与你的应用程序一起分发到Google Translate。几乎每个人都会这样。这可能是个问题,也可能不是,我认为谷歌API密钥通常是用Javascript发送给浏览器客户端的,所以它们不是什么大秘密。保护它不受用户攻击的唯一方法是运行自己的服务器,使用存储在服务器上的API密钥将应用程序查询转换为Google Translate查询

(这可能是显而易见的,但请注意,HTTPS是一种传输协议,它可以保护移动中的数据,即通过网络发送的数据,而不是静止的数据,即当数据在移动电话上的应用程序中时。)


至于如何确保没有人冒充谷歌的服务器,以及是否需要证书固定。证书是您的保证,在大多数情况下,这是不可能的。几乎任何您选择与https Web服务器通信的标准方法,您的底层框架和/或操作系统都将验证服务器证书并确保没有模拟。这就是证书的用途。证书固定用于减轻客户端上安装的恶意受信任根证书之类的威胁。与公司网络中的示例一样,通常情况下,公司CA根证书作为受信任根安装在托管客户端上,从那时起,公司代理也可以通过伪造服务器密钥和证书窥视客户端SSL流量。这是唯一可能的,因为公司根证书是预安装的,攻击者不可能这样做。类似的威胁是,攻击者将其证书作为受信任的根用户安装在客户端上,但这种情况已不再常见。根据您的威胁模型,您可能希望获得针对它的保护,但在大多数情况下,使用标准web客户端与https API对话就足以验证服务器,您可以确保当您从,这实际上来自google.com。

您可以尝试实现自己的SSL固定,但对于您的translate API密钥来说,这完全是小题大做。它的价值不足以让任何人窃取,也不难替换。确切地说,实现SSL固定完全是一种过火的行为。我必须设置自己的服务器,购买自己的SSL证书,等等。我的translate API密钥之所以有价值,是因为其他人很容易获取并滥用它,唯一的目的就是要花我的钱。不,你不需要自己的服务器和证书,但同样,没有人会偷你的API密钥,如果他们偷了,很有可能你不会对这种用法负责。如果你是超级偏执狂,你可以向谷歌提出这个问题,但在这一点上,这并不是一个真正的编程问题。这不是什么编程问题,如果我选择实现SSL固定,我怎么不需要自己的服务器和证书呢?我只是在使用一个API,所以我无法访问可以存储在捆绑包中的Google证书。再一次,仍然在学习SSL,所以请原谅我对SSL固定的任何误解您知道证书,因为它们是公开的。您可以使用这样的库(或者至少将其用作起点)。如果你搞错了,这也是一个很好的方法,可以在将来悄悄地破坏你的应用程序。我建议您按原样使用SSL。感谢Gabor的回复。在搜索了一段时间后,我意识到是的,我的API密钥将存储在应用程序包中,任何人都可以使用字符串工具以这种方式获取密钥。我想我可以用这种方法。我试图避免设置自己的服务器,只向谷歌发送翻译请求,而这一切仅仅是为了保护一个API密钥。