【问题标题】:How can i secure this API in an APK file如何在 APK 文件中保护此 API
【发布时间】:2013-01-02 16:36:56
【问题描述】:

我目前正在为我运行的网站开发 api。该 api 将在许多地方使用,其中一个地方是 Android 应用程序。

它的目的是允许用户登录和下载文件。我有 api 版本,它将使用 HTTPS,因此所有数据在传输时都很好。

我遇到的问题是 API 调用需要 API 密钥。使用此密钥,您将能够访问可能导致问题的 API 的某些功能。

我想知道,有没有办法保护这个 API 密钥?我根本不是 Android 开发人员,但人们会使用 Android 上的 API,所以我需要制定解决方案。

以下是 API 使用的流程示例:

// Log the user in with their username and password (HTTPS, so not really an issue)
romhut.request('/api/users/login?apikey=KEY', {username : 'scott', password : 'password'}, function(r) { 

    console.log(r);

    // Once you have the token, request the API key that allows actions such as downloading
    romhut.request('/api/files/download?apikey=KEY', {token : r.token, file : file}, function(d){

        console.log(d);
        // Download the file

    }, 'POST');

}, 'POST');

【问题讨论】:

  • 您想离线存储 API 密钥,还是登录后在运行时检索?
  • API 密钥由开发者提供,它从用户那里返回一个令牌,然后可以使用它来做请求
  • 我已经更新了我的示例。使用例更简单。
  • 您是否正在寻找有关此问题的其他信息?

标签: java php android security api


【解决方案1】:

您应该为每个用户创建一个特定的 API 密钥。没有真正好的方法来保护实际在用户手中的数据(询问版权保护制造商)然后您可以使用 HMAC 将 API 密钥和请求的 API 散列在一起,并验证两端是否发生相同的事情.见:http://en.wikipedia.org/wiki/Hash-based_message_authentication_code(PHP 有这个功能。)

事实上,更准确的说法是密钥和用户之间应该存在多对一的关系,因为您可能拥有不同的和/或已撤销的用户密钥。

有关出色的概述,请参阅:https://security.stackexchange.com/questions/18572/is-it-okay-for-api-secret-to-be-stored-in-plain-text-or-decrypt-able

【讨论】:

  • 这就是重点。登录后检索 API 密钥将是一个更好的解决方案恕我直言。
  • 问题在于,为了让用户能够登录,应用程序的开发者也需要提供他们的 API。没有这个,任何人都可以从任何地方登录,并且无法跟踪哪些应用程序在做什么。这也意味着用户无法取消对特定应用的授权。
  • 如果您想尝试限制人们使用哪些应用程序连接到您的服务,我认为您能做的最好的事情就是在应用程序中存储一个全局机密并使用它来“验证”请求来自特定的应用程序。任何确定的人都可以提取该秘密,然后从任何地方登录(或发布秘密允许任何人从任何地方登录)。
  • 是的,这就是我遇到的问题。任何人都可以访问 APK 文件中的 API 密钥这一事实。猜猜它必须这样做。他们无能为力,能够执行他们仍然需要以用户身份进行身份验证的任何编辑操作,他们只能使用用户名和密码来完成(将来可能会摆脱它)
  • 无法避免 API 密钥的可读性 - 它用作加密密钥而不是可散列密码
【解决方案2】:

没有。一旦将 API 密钥嵌入 Android 应用程序,就无法保护它。该应用程序需要访问 API 密钥,因此有权访问该应用程序的人将能够从应用程序中恢复该密钥并将其用于自己的目的。您可以做的最好的事情是混淆您的应用程序,以便对其进行逆向工程更加困难(目标是使攻击者更难逆向您的应用程序,而不是花费他的时间)。您需要根据暴露 API 密钥的风险来决定在这方面需要付出多少努力,但您永远不能让它无法恢复,只会变得更加困难。实际上,您最好的选择是在构建过程中打开 Proguard(因此,在 APK 中,事情在一定程度上被混淆了,而您没有任何工作)并希望获得最好的结果。

【讨论】:

    【解决方案3】:

    Android 密钥库是一个值得关注的方向吗?然后,可能会根据安装时应用程序存储在 android 密钥库中的密钥将加密字符串发布到 API。这样,如果解密成功,它就可以处理请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多