有没有一种安全的方法来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文件。

  • 安装拆分apks时出错:com.android.ddmlib.InstallException:未能完成会话:INSTALL_FAILED_INVALID_APK
  • 如何上传多个android档案(每个档案一个)
  • 资源$ NotFoundException:文件res / drawable / abc_ic_ab_back_material.xml
  • Gradle中基于构build变体的不同drawable
  • 在0.4.6升级后,Gradle Sync不会完成
  • 按密度分割的APK仍包含所有资源
  • 更好的地方把versionCode / versionName? build.gradle vs AndroidManifest.xml
  • 如何打开现有的Android项目(build.gradle)到android studio
  • 这是另一种方式:

    将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