如何在APK文件中保护此API

时间:2013-01-18 21:25:01

标签: java php android security api

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

没有。将API密钥嵌入到Android应用程序中后,无法保护API密钥。该应用需要访问API密钥,因此有权访问该应用的用户将能够从应用内恢复该密钥并将其用于自己的目的。你可以做的最好的事情是混淆你的应用程序,以便逆向工程更困难(目标是让攻击者更难以扭转你的应用程序而不是他的时间)。您需要根据暴露的API密钥的风险来决定在这方面需要多少努力,但是您永远无法使其无法恢复,只是更难。实际上,你最好的选择是在你的构建过程中最有可能打开Proguard(因此在APK中没有工作的东西被混淆到合适的程度)并且希望最好。

答案 2 :(得分:0)

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