我是否应该将Android应用的发布密钥存储区提交到团队存储库?

mao*_*mao 24 git android android-studio

我们正在开发团队中的Android应用程序.要创建签名发布apk,您应该设置密钥存储路径,密码,密钥别名和密钥密码.如果我想要我和我的团队成员可以创建具有相同签名的签名apk,我应该将密钥存储文件提交给源代码控制吗?

Jus*_*tin 33

你不应该.

Release keystore 是最敏感的数据.

在我的团队中,只有一个人可以签署发布包.(可能是一个备份).

必须忽略所有敏感信息,我们会参考这些信息.

在我的团队中,我们配置如下:

Android Studio:

/local.properties 文件:

storeFile=[path/to/keystore/file]
keyAlias=[alias's key]
keyPassword=[alias's password]
storePassword=[key's password]
Run Code Online (Sandbox Code Playgroud)

/app/build.gradle,config范围:

signingConfigs {
  release {
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    storeFile file(properties.getProperty('storeFile'))
    keyAlias properties.getProperty('keyAlias')
    storePassword properties.getProperty('storePassword')
    keyPassword properties.getProperty('keyPassword')
  }
}

buildTypes {
  release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    signingConfig signingConfigs.release
  }
  .
  .
  .
}
Run Code Online (Sandbox Code Playgroud)

查看我的完整演示配置:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "22.0.1"

    defaultConfig {
        multiDexEnabled = true

        applicationId "com.appconus.demoapp"
        minSdkVersion 16
        targetSdkVersion 21
        multiDexEnabled = true
        versionCode 18
        versionName "1.3"
    }

    signingConfigs {
        release {
            Properties properties = new Properties()
            properties.load(project.rootProject.file('local.properties').newDataInputStream())
            storeFile file(properties.getProperty('storeFile'))
            keyAlias properties.getProperty('keyAlias')
            storePassword properties.getProperty('storePassword')
            keyPassword properties.getProperty('keyPassword')
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        applicationVariants.all { variant ->
            appendVersionNameVersionCode(variant, defaultConfig)
        }
    }
}
dependencies {
    compile 'com.google.android.gms:play-services:8.1.0'
}
Run Code Online (Sandbox Code Playgroud)

  • 如果只有一个人丢失了密钥库(例如磁盘损坏),那么你必须上传一个新的应用程序,旧用户无法更新他们的应用程序.我们的团队在私人仓库中提交密钥库,但签名信息(storepass,keyalias,keypass)是私有的. (10认同)
  • 我不明白为什么共享一个jks文件不是好习惯.谁使用它来签署apk,需要同时拥有密码和jks文件的别名.如果你不存储那些,那你就安全了吧? (5认同)
  • 这也在这里解释:https://developer.android.com/studio/publish/app-signing.html#secure-shared-keystore (4认同)

Eri*_*sen 12

前进:

  • 它是 AES 加密的
  • 您可以将凭据保留在源代码控制之外(例如,KeePass、Beyond Trust)
  • 没有凭据,任何人都无法访问密钥

但是,也有缺点:您在签入时会引入一些被强制执行的风险。因此,您应该进行成本效益分析并确定这对您来说是否值得。


另一个考虑因素是您的组织已经在使用什么进行配置管理。如果你有一个像 Azure DevOps (TFS/VSTS) 这样的系统,你应该尝试利用它。如果你有一个秘密管理器,你应该与它集成。

有一些权衡:

+---------------------------+-------------------+- -----+--------+--------+------------------------+
| 方法 | 示例 | 容易 | 简单 | 安全 | 关注点分离 |
+---------------------------+-------------------+- -----+--------+--------+------------------------+
| 配置管理系统 | Azure DevOps | | | X | X |
| 私人回购:未加密 | 明文秘密 | X | X | | |
| 私有仓库:加密 | git 秘密 | | X | X | |
| 秘密经理 | Azure Key Vault | | | X | X |
+---------------------------+-------------------+- -----+--------+--------+------------------------+

就个人而言,如果我在大型组织中设置此功能,我会四处寻找秘密经理。对于个人项目或小团队,我只需提交密钥库并将凭据保存在其他地方。这取决于范围、风险和可用的基础设施。