在HTTP请求中保护API密钥

时间:2016-11-19 21:29:40

标签: ios security ssl translate api-key

经过一天的搜索SSL和HTTPS后,我对如何做一些非常简单的事情感到很困惑。我有一个没有用户身份验证的小应用程序。所有用户都看到一个简单的应用程序。

我正在尝试使用Google翻译API。我有一个翻译API密钥,但我完全忘记了如何保护它。我想直接从我的iOS应用程序调用Google翻译,并根据api文档(https://cloud.google.com/translate/docs/reference/rest),apiKey作为请求参数' key'提供。 API文档还说谷歌翻译支持SSL,但显然我没有对我的ios应用程序进行任何类型的SSL检查以确认身份。我的问题是,如何停止可以获取我的翻译API密钥并滥用它的MITM攻击?我尝试使用Charles,我显然能够看到密钥被传递。

我在互联网上阅读的每一项资源都说他们使用SSL,一切都很好。但是,没有关于如何在使用Google等热门服务的iOS应用中使用SSL的示例。

关于如何制作这个简单的GET请求以及防止我的密钥被盗的任何想法?

修改

SSL Pinning对此非常有用。我不考虑使用SSL,但我不知道这对iOS和像Google这样的实体有用(根据下面的@pvg讨论)。

1 个答案:

答案 0 :(得分:1)

您尝试使用HTTPS,因为您不希望别人拥有您的API密钥。如果您的应用直接连接到谷歌翻译,您是否要关注API密钥的存储位置? :)

您必须使用自己的应用将API密钥分发到Google翻译。几乎每个人都会这样。这可能是也可能不是问题,我认为Google API密钥通常都是在Javascript中发送给浏览器客户端,所以它们并没有那么大的秘密。保护用户免受用户侵害的唯一方法是运行您自己的服务器,使用您服务器上存储的API密钥将应用查询转换为Google翻译查询。

(也许这很明显,但请注意,HTTPS是一种传输协议,它可以保护运动中的数据,即通过网络发送数据,但不保护静止数据,即当它在您的网络中时手机上的应用程序。)

至于如何确保没有人冒充谷歌的服务器,以及你是否需要证书固定。证书是您的保证,在大多数情况下,这是不可能的。几乎所有您选择与https网络服务器通信的标准方法,您的底层框架和/或操作系统都将验证服务器证书并确保没有模拟。这是证书的用途。证书固定用于减轻客户端上安装的恶意受信任根证书之类的威胁。例如,在公司网络中,通常情况是公司CA根证书作为受管客户端上的受信任根安装,从那时起,公司代理也可以通过伪造服务器密钥来查看客户端SSL流量。证书。这是唯一可能的,因为预先安装了公司根证书,攻击者无法做到这一点。类似的威胁是攻击者设法将其证书作为受信任的根安装在客户端上,但这种情况不再常见。根据您的威胁模型,您可能需要对其进行保护,但在大多数情况下使用标准Web客户端与https API通信是对服务器的充分验证,您可以确保从https://google.com下载某些内容时,实际上来自google.com。