【问题标题】:Best practices for API Key and Secret in bundled in AppApp 中捆绑的 API Key 和 Secret 的最佳实践
【发布时间】:2016-08-08 23:04:53
【问题描述】:

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

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

但是,将这些放在服务器上也无济于事,有人可以对我用来发送短信的服务器端点进行逆向工程,然后改用它。

例如我可以对 WhatsApp 进行逆向工程,并获取他们用于电话号码验证的私钥或 API 端点,然后在我的应用程序中使用它,从而为我节省了数千美元。

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

【问题讨论】:

    标签: android ios api security


    【解决方案1】:

    在服务器上隐藏 API 密钥

    但是,将这些放在服务器上也无济于事,有人 可以对我用来发送的服务器端点进行反向工程 短信并改用它。

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

    如果有人可以访问您的网络服务的密钥,他们只能做您的服务允许他们做的事情。拥有一个封装所有 3d 方密钥和 API 的 Web 服务是一个非常好的主意 - 这样更安全。

    没有人可以访问您的敏感密钥,这将允许他们执行一切

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

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

    在应用中隐藏 API 密钥

    如果有人下定决心,您将无法阻止从您的应用中对密钥进行逆向工程。你只能让这更难。 计算机安全永远不应该是“做起来有多难/多复杂”,但在这种情况下,我们别无选择。

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

    您可以对您的密钥进行混淆处理,这样就无法直接读取它们。结果将是它们分散在一个编译文件中,而不是舒适地放在一个地方。

    在 iOS 上你可以使用 like this.

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

    加密密钥

    另一个让黑客难以攻击的方法是加密密钥。

    Here's an example for iOS.

    你可以对 Android 做同样的事情。

    完美场景

    好的,假设您有一个用于视频管理的第三方 API。

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

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

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

    【讨论】:

      【解决方案2】:

      我认为 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}

      我已经在这个blog中详细讨论了该方法并制作了a sample project

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-31
        • 2017-04-26
        • 2022-01-27
        • 2017-11-13
        • 2012-09-20
        • 1970-01-01
        • 2021-08-24
        • 2015-08-26
        相关资源
        最近更新 更多