有没有一种安全的方法来管理API密钥?

时间:2015-10-14 19:32:00

标签: android android-gradle

我在我的应用中使用API。我目前从java接口

管理API密钥
public interface APIContract {
    //The API KEY MUST NOT BE PUBLISH. It is possible to generate a new one for free from www.themoviedb.org
    //Remove before commit !!!
    String API_KEY = "abcdefghijklmnopqrstuvwxyz";
    /...
}

这样做。我可以使用APIContract.API_KEY访问密钥,但正如您在注释中看到的那样,如果我使用git和公共存储库(我不想发布此密钥),这是不安全的。

所以这是我的问题:是否可以将此密钥移动到另一个我可以从我的应用程序轻松访问但不会被提交的地方?

我发现这个thread使用gradle存储密钥,但我需要提交build.gradle文件,因此它不能完成工作。

有人知道如何解决这个问题吗?我没有在stackoverflow中发现类似的问题,但也许我错过了一些东西

修改 我喜欢在任何Java代码之外移动密钥的想法,因为其他人(可能是非技术人员)可以轻松管理自己的密钥。我正在考虑使用像settings.gradle这样的gradle文件。

4 个答案:

答案 0 :(得分:54)

1。将api密钥存储在xml文件中

将xml文件“api_keys.xml”放在目录“res / values /".

api_keys.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="THE_MOVIE_DB_API_TOKEN">XXXXX</string>
</resources>

在java代码中使用api密钥

context.getString(R.string.THE_MOVIE_DB_API_TOKEN);

2。借助Gradle和gradle.properties文件

存储API密钥

Example_0 Example_1

将以下行添加到[USER_HOME] / .gradle / gradle.properties

对于Windows操作系统,Denis用户的示例:

C:\Users\Denis\.gradle

gradle.properties

MyTheMovieDBApiToken="XXXXX"

将以下代码添加到build.gradle文件

的build.gradle

apply plugin: 'com.android.application'

android {
    ...

    defaultConfig {
        ...
    }
    buildTypes {
        release {
            ...
        }
    }
    buildTypes.each {
      it.buildConfigField 'String', 'THE_MOVIE_DB_API_TOKEN', MyTheMovieDBApiToken
    }
}

在java代码中使用api密钥

BuildConfig.THE_MOVIE_DB_API_TOKEN)

3。借助gradle和系统路径变量

存储API密钥

Example_0

添加新系统PATH变量 THE_MOVIE_DB_API_TOKEN =“XXXXX”

对于Windows操作系统:

  • 开放系统
  • 高级系统设置
  • 环境变量
  • 将新变量添加到用户变量

将以下代码添加到build.gradle文件

的build.gradle

apply plugin: 'com.android.application'

android {
    ...

    defaultConfig {
        ...
    }
    buildTypes {
        release {
            ...
        }
        buildTypes.each {
            it.buildConfigField 'String', 'THE_MOVIE_DB_API_TOKEN', "\"$System.env.THE_MOVIE_DB_API_TOKEN\""
        }
    }
}

在java代码中使用API​​密钥

BuildConfig.THE_MOVIE_DB_API_TOKEN

Link to my gist on github

答案 1 :(得分:22)

这是另一种方式:

将API密钥放在构建机器/服务器可访问的文件中,我们将其称之为:

/usr/api_user/api_key1

内容:

myApiKey = abcdefghijklmnopqrstuvwxyz

现在您将使用`BuildConfig&#39;来访问它。 gradle对象。将您的代码修改为:

public interface APIContract {
    //The API KEY MUST NOT BE PUBLISH. It is possible to generate a new one for free from www.themoviedb.org
    //Remove before commit !!!
    String API_KEY = BuildConfig.MY_API_KEY;
    /...
}

然后在build.gradle中添加如下内容:

buildConfigField "String", "MY_API_KEY", getMyApiKey("myApiKey")

还要加上:

//return a MY API KEY from a properties file.
def getMyApiKey(String property){
    Properties properties = new Properties()
    properties.load(new FileInputStream("/usr/api_user/api_key1"))
    return "\"" + properties.getProperty(property) +"\""
}

您可以重新定位API目录位置,因为它不是您的仓库的一部分。当然,它将具有构建的文件系统依赖性...您可以在CI / CD环境(可能是Jenkins之类的工具)中进行列表设置,以将构建文件复制到私有仓库,以进行备份。

答案 2 :(得分:1)

您可以将密钥添加到gradle.properties文件中或将其作为参数传递

答案 3 :(得分:0)

我将它们放在开发计算机或ci服务器上的全局import this import codecs zen_of_python = codecs.encode(this.s, 'rot13') 文件中。这种方式不是项目的一部分,因此您不必担心在存储库中检查它,但是仍可以从gradle文件中轻松访问它。 例如,全局gradle.properties文件应位于Mac上的gradle.properties内部-顺便说一句,如果不存在,则应创建该文件。 然后,可以在您的 build.gradle 文件中引用这些属性,例如,使用与您在˜/.gradle文件中使用的相同名称将它们公开为 buildConfigFields 。 / p>

gradle.properties

然后在Java / Kotlin代码上,您可以以buildConfigField 'String', 'API_KEY', maps.api.key 的身份访问它们