3

我目前正在为我运行的网站开发一个 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');
4

3 回答 3

2

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

于 2013-01-20T00:26:44.770 回答
2

您应该为每个用户创建一个特定的 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

于 2013-01-18T21:35:34.997 回答
0

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

于 2020-10-12T12:06:31.980 回答