【问题标题】:Secure way of storing Secret credentials存储秘密凭证的安全方式
【发布时间】:2017-10-16 06:31:31
【问题描述】:
我有一个 Android 应用程序,我想将其部署用于商业用途。我正在使用 aws 机密凭据,目前我已将其硬编码在代码中。
是否有任何安全的方式来部署 Android 应用程序,通过将凭据作为外部参数传递。就像我们在服务器应用程序中所做的一样,将凭据作为环境变量传递。我不想在我的代码库中打开密钥。
我想知道是否有任何方法可以在 android 应用中做类似的事情。
【问题讨论】:
标签:
android
security
environment-variables
firebase-security
【解决方案1】:
我会使用与Environment variables 相同的原理,但通过 Gradle。
这个想法是你应该在你的用户文件夹中有一个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* 信息。
【解决方案3】:
我发现了以下在构建时将凭据作为环境变量传递给 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);
这个方法对我有用,如果有人知道更好的方法,请评论。