App中捆绑的API Key和Secret的最佳实践

时间:2016-04-17 05:52:49

标签: android ios api security

我正在开发一个应用程序,它将使用短信来验证用户的电话号码,这是通常的“输入代码”例程。

在阅读了一点之后,为我在应用程序中使用的第三方(twilio,nexmo等)存储私钥似乎是一个坏主意。有人可以从我的二进制文件中对这些进行逆向工程,并在他们的应用程序中使用它们。

然而,在服务器上安装这些也无济于事,有人可能只是对我用来发送短信的服务器端点进行逆向工程并改为使用它。

E.g。我可以对WhatsApp进行反向工程,并获取用于验证电话号码的私钥或API端点,并在我的应用中使用它,节省了数千美元。

关于如何保护自己免受此类攻击的任何想法?

2 个答案:

答案 0 :(得分:4)

隐藏服务器上的API密钥

  

但是,在服务器上安装这些也不会对某人有所帮助   可以反向设计我用来发送的服务器端点   短信并使用它。

是的,它确实有很大帮助。

如果有人可以访问您的网络服务的密钥,他们只能做,您的服务允许他们做什么。这是一个非常好的想法,拥有一个封装所有3D派对密钥和API的Web服务 - 它更安全。

任何人都无法访问您的敏感密钥,并允许他们执行所有内容

例如,第三方API允许删除 - 您的服务器包装器API将不允许它。

此外,您可以为可疑行为添加任何额外的逻辑或警报。

隐藏应用程序中的API密钥

如果有人下定决心,那么您无法阻止从您的应用中反向设计您的密钥。你只能做得那么难。 计算机安全永远不应该是"做起来有多困难/复杂" ,但在这种情况下我们别无选择。

好的,所以你必须将API密钥硬编码到你的源文件中。它可以很容易地进行逆向工程。

您可以对密钥进行模糊处理,以便无法直接阅读。结果将是它们分散在一个编译文件中,而不是舒适地放在一个地方。

在iOS上,您可以使用like this.

在Android上,您可以使用DexGuard或任何其他方式来混淆字符串。

加密密钥

让黑客难以接受的另一层是加密密钥。

Here's an example for iOS.

你也可以为Android做同样的事情。

完美情景

好的,我们假设您有第三方API进行视频管理。

黑客想要删除服务器上的所有视频,因为第3个API允许这样做。

首先,他必须粘贴文件中所有分散的字符串。如果他设法做到这一点,他必须找到解密的方法。

即使他设法解密,也会向他提供服务器和服务器的API密钥,而服务器只允许上传视频,而不是删除它们。

答案 1 :(得分:0)

我认为firebase功能可以帮助我们隐藏第三方API密钥。 建议的解决方案 -

  1. 将API密钥存储在firebase中作为环境变量。
  2. 制作firebase https功能,仅回复经过身份验证的用户。如果经过身份验证的用户请求它,则会从firebase环境变量中返回秘密API密钥作为响应。
  3. Android应用首次匿名登录firebase,获取令牌。
  4. 此请求在请求firebase https功能时用作标头中的授权令牌。 firebase函数类似于https://us-central1- {your_project_name} .net / {function_name}
  5. 我已在此blog详细讨论了该方法,并提出了a sample project