我有一个android应用程序,我想将其部署用于商业用途。我正在使用 aws 秘密凭证,目前我已将其硬编码在代码中。
是否有任何安全的方法来部署 Android 应用程序,通过将凭据作为外部参数传递。就像我们在服务器应用程序中所做的那样,将凭据作为环境变量传递。我不想在我的代码库中打开密钥。
我想知道是否有任何方法可以在Android应用程序中做类似的事情。
我会使用与
Environment variables
相同的原理,但通过 Gradle。
这个想法是,你应该在你的 User 文件夹中有一个 gradle.properties 文件,Gradle 可以从中获取属性。当然,这个文件不会被添加到源代码管理中。
你可以做这样的事情
~/.gradle/gradle.properties
projectAwsCred1=cred1
projectAwsCred2=cred2
build.gradle(应用程序)
...
buildConfigField "String", "AWS_CRED_1", "\"projectAwsCred1\""
buildConfigField "String", "AWS_CRED_2", "\"projectAwsCred2\""
然后(构建后)您可以像平常一样在代码中调用它
Build.AWS_CRED_1
这样您的凭据将在您的应用程序中烘焙,但仅在构建时进行。当然,您必须将其记录在自述文件中,以便其他人(或将来的您)知道是否放置了
projectAwsCred*
信息。
根据您的设置,有多种方法可以执行此操作。最安全的方法可能是让您的应用程序实例承担具有所需权限的角色,这样您就根本不需要存储您的凭据。
进一步阅读应该足以让您开始:http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html
我发现以下方法可以在构建时将信用作为环境变量传递给 apk。这些将存储为构建变量。
在您的项目目录中创建一个 gradle.properties 文件并添加您的凭据:
AWS_CRED=aws_cred
在你的 gradle 构建文件中,在 android 下添加以下内容:
android {
defaultConfig{
manifestPlaceholders=[AWS_CRED:AWS_CRED]
}
}
它的作用是将构建变量传递到您的 Android 清单。现在转到 AndroidManifest.xml 并在标签下添加以下内容:
<application
<meta-data
android:name="AWS_CRED"
android:value="${AWS_CRED}" />
</application>
现在在任何java代码中访问 的值,如下所示:
applicationInfo = getApplicationContext().getPackageManager().getApplicationInfo(getApplicationContext().getPackageName(), PackageManager.GET_META_DATA);
这个方法对我有用,如果有人知道更好的方法,请评论。
这是我对我所做的。
首先,我在
gradle.properties
下创建了一个全局 ~\.gradle
文件。请注意,它位于我的用户文件夹中,而不是项目的根目录中,因为该目录必须包含在 git 中。
然后,我在那里写下了我的密钥:
apiKey=83hfidf8uf
在我的应用程序模块的
build.gradle.kts
:
我通过使用此属性委托引用了密钥:
val apiKey: String by project
注意
gradle.properties
键和build.gradle.kts
变量名必须相同。
然后,我将其添加到我的默认配置中
buildConfigField("String", "API_KEY", apiKey)
然后,我将其添加到我的 buildFeatures 中
buildConfig = true
然后,我在源代码中引用它,如下所示
BuildConfig.API_KEY