如何安全地设置StorePassword & KeyPassword?

问题描述 投票:0回答:2

当我想发布我的应用程序时,如何确保我的签名应用程序的安全信息 我不想对其进行硬编码。 我想让它们免受攻击者和逆向工程的侵害

//gradle app file
SigningConfigs {
        release {
            storeFile file("myreleasekey.keystore")
            storePassword "myHardCodePassword"
            keyAlias "MyHardCodeReleaseKey"
            keyPassword "MyHardCodePassword"
        }
    }

谢谢您的帮助

android security proguard android-security android-r8
2个回答
0
投票

这实际上可以归结为身份验证。首先,恭喜你通过外化秘密做了正确的事情。在应用程序中对秘密进行硬编码以试图隐藏它们(通过模糊实现安全性)只会使任何攻击增加几秒钟的时间。

您的应用程序以某种身份运行,例如服务帐户。如果可能的话,只有服务帐户应该能够读取该文件(

400
权限)。您还必须至少编写一次该文件,但我现在将其放在一边并假装它已由您的应用程序部署处理。

这里的问题是谁可以冒充您的应用程序的身份。例如,你可以运行

sudo -u myapp /usr/bin/bash -l
吗?然后你就可以阅读其中的秘密了。将秘密存储在“保险库”(如Hashicorp Vault)中是一个好主意,但它不能解决身份验证问题。您仍然需要存储凭据以向 Vault 进行身份验证并获取机密。在本地加密文件也不好,因为您必须使用文件中的另一个密码来保护对加密密钥的访问。

您可以选择文件,仅此而已。除非...

在云等托管平台上运行,甚至是自我管理的 Kubernetes,您可以 使用平台启动时为应用程序提供的身份。身份验证是隐式完成的,因为您的 DevOps 管道允许该应用程序运行。您运行的平台将授权您的应用程序读取其拥有的机密。它可能不再是一个文件,因此您可能需要在应用程序中编写一些脚本或额外的代码。

如果您需要在无人值守的情况下引导此过程,您可能必须要求用户登录(开放端点),然后生成他们访问后端所需的唯一密钥或凭据。如果您同意他们不登录,请默默地为他们提供访客帐户。但任何人都可以逆转该协议,只需向服务器询问密钥即可。


0
投票

首先,您在此处列出的签名配置是在 Gradle 中定义的,并在构建过程中使用。它们不会被发送到最终的

.apk
文件中。

不存在通过逆向工程或仅检查您的应用程序访问它们的风险,因为它们根本不存在。

但是,风险在于将其(密钥库及其密码)存储在存储库中。如果您的源代码有一天会受到损害,那么它们也会受到损害。

您可以做的是将密钥库及其密码存储在 CI 上,并在构建过程中访问它,在您的

build.gradle
中访问它,例如:

release {
            storeFile file("path-to-your-keystore-on-ci")
            storePassword System.getenv("your_password_variable")
            keyAlias "MyHardCodeReleaseKey"
            keyPassword System.getenv("your_key_password_variable")
        }
© www.soinside.com 2019 - 2024. All rights reserved.