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

Tho*_*aud 40 android android-gradle-plugin

我在我的应用程序中使用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";
    /...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Den*_*nis 55

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>
Run Code Online (Sandbox Code Playgroud)

在java代码中使用api密钥

context.getString(R.string.THE_MOVIE_DB_API_TOKEN);
Run Code Online (Sandbox Code Playgroud)

2.借助Gradle和gradle.properties文件存储API密钥

Example_0 Example_1

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

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

C:\Users\Denis\.gradle
Run Code Online (Sandbox Code Playgroud)

gradle.properties

MyTheMovieDBApiToken="XXXXX"
Run Code Online (Sandbox Code Playgroud)

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

的build.gradle

apply plugin: 'com.android.application'

android {
    ...

    defaultConfig {
        ...
    }
    buildTypes {
        release {
            ...
        }
    }
    buildTypes.each {
      it.buildConfigField 'String', 'THE_MOVIE_DB_API_TOKEN', MyTheMovieDBApiToken
    }
}
Run Code Online (Sandbox Code Playgroud)

在java代码中使用api密钥

BuildConfig.THE_MOVIE_DB_API_TOKEN)
Run Code Online (Sandbox Code Playgroud)

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\""
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

BuildConfig.THE_MOVIE_DB_API_TOKEN
Run Code Online (Sandbox Code Playgroud)

链接到我在github上的要点


Jim*_*Jim 22

这是另一种方式:

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

/usr/api_user/api_key1
Run Code Online (Sandbox Code Playgroud)

内容:

myApiKey = abcdefghijklmnopqrstuvwxyz
Run Code Online (Sandbox Code Playgroud)

您现在将使用`BuildConfig'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;
    /...
}
Run Code Online (Sandbox Code Playgroud)

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

buildConfigField "String", "MY_API_KEY", getMyApiKey("myApiKey")
Run Code Online (Sandbox Code Playgroud)

并添加这个:

//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) +"\""
}
Run Code Online (Sandbox Code Playgroud)

您可以重新定位API目录位置,因为它不是您的仓库的一部分.当然,那么它将会对构建...你可以有一个CI/CD环境列表设置(也许像詹金斯的工具)来构建文件复制到私人回购协议,用于备份文件系统的依赖.