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

我在我的应用程序中使用了一个API 。 我目前从一个java界面pipe理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和公共存储库(我不假设发布此密钥),这是不安全的。

所以这里是我的问题:是否有可能把这个键在另一个地方,我可以轻松地从我的应用程序访问,但不会被提交?

我发现这个线程使用gradle来存储密钥,但我需要提交build.gradle文件,所以它不会做这项工作。

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

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

Solutions Collecting From Web of "有没有一种安全的方法来pipe理API密钥?"

这是另一种方式:

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

 /usr/api_user/api_key1 

内容:

 myApiKey = abcdefghijklmnopqrstuvwxyz 

您现在将使用“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; /... } 

然后在你的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目录位置,以便它不属于您的回购协议的一部分。 当然,那么它将具有构build文件系统的依赖关系…您可以在CI / CD环境(可能是像Jenkins这样的工具)中将列表设置为复制构build文件到专用的repo,以备用。

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和系统pathvariables存储api密钥

Example_0

添加新的系统PATHvariablesTHE_MOVIE_DB_API_TOKEN =“XXXXX”

对于Windows操作系统:

  • 开放的系统
  • 高级系统设置
  • 环境variables
  • 添加新的variables到用户variables

将下面的代码添加到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) 

链接到我的github的要点

您可以将该键添加到gradle.properties文件或将其作为parameter passing