我有一个Android应用程序,我想部署用于商业用途。我正在使用aws秘密凭证,目前我已经在代码中对其进行了硬编码。
通过将凭据作为外部参数传递,是否有任何安全的方式来部署Android应用程序。就像我们在服务器应用程序中所做的那样,将凭据作为环境变量传递。我不希望在我的代码库中打开密钥。
我想知道在Android应用程序中是否有任何类似的功能。
答案 0 :(得分:2)
我会使用Environment variables
的相同原则,但通过Gradle。
您的想法是,您的用户文件夹中应该有一个gradle.properties文件,Gradle可以从中获取属性。当然,此文件不会添加到源代码管理中。
你可以做这样的事情
<强>〜/ .gradle / gradle.properties 强>
projectAwsCred1=cred1
projectAwsCred2=cred2
build.gradle(app)
...
buildConfigField "String", "AWS_CRED_1", "\"projectAwsCred1\""
buildConfigField "String", "AWS_CRED_2", "\"projectAwsCred2\""
然后(在构建之后),您可以在代码中将其称为普通Build.AWS_CRED_1
这样您的凭据就会在您的应用中出现,但仅限于构建时间。您当然必须在自述文件中记录这一点,以便其他人(或将来您)知道放置projectAwsCred*
信息。
答案 1 :(得分:0)
根据您的设置,有几种方法可以执行此操作。可能最安全的方法是让您的应用程序实例承担一个具有所需权限的角色,这样您根本不需要存储凭据。
进一步阅读应足以让您入门:http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html
答案 2 :(得分:0)
我发现以下方法可以在构建时将Creds作为Envirnoment Variables传递给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);
这种方法对我有用,如果有人知道更好的方法,请发表评论。