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

我是否应该将Android应用程序的发布密钥存储提交给团队存储库?,android,git,android-studio,Android,Git,Android Studio,我们正在团队中开发android应用程序。要创建签名发布apk,您应该设置密钥存储路径、密码、密钥别名和密钥密码。如果我希望我和我的任何团队成员能够创建具有相同签名的已签名apk,我是否应该将密钥存储文件提交给源代码管理?您不应该这样做 Release keystore是最敏感的数据 在我的团队中,只有一个人可以签署发布包。(并且可能是用于备份的) 必须忽略所有敏感信息,我们会参考这些信息 在我的团队中,我们的配置如下: 在Android Studio上: /local.properties文件

我们正在团队中开发android应用程序。要创建签名发布apk,您应该设置密钥存储路径、密码、密钥别名和密钥密码。如果我希望我和我的任何团队成员能够创建具有相同签名的已签名apk,我是否应该将密钥存储文件提交给源代码管理?

您不应该这样做

Release keystore
是最敏感的数据

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

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

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

在Android Studio上:

/local.properties
文件:

storeFile=[path/to/keystore/file]
keyAlias=[alias's key]
keyPassword=[alias's password]
storePassword=[key's password]
/app/build.gradle
配置
范围:

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
  }
  .
  .
  .
}
请参阅我的完整演示配置:

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'
}
继续:

  • 它是加密的
  • 您可以将凭据保留在源代码管理之外(例如,KeePass、Beyond Trust)
  • 没有凭据,任何人都无法访问密钥
然而,也有缺点:当你签入它时,你会引入一些被暴力强迫的风险。所以你应该做一个成本效益分析,看看这对你来说是否值得


另一个需要考虑的问题是您的组织已经在使用什么进行配置管理。如果您有像Azure DevOps(TFS/VSTS)这样的系统,您应该尝试利用它。如果你有一个秘密管理者,你应该融入其中

有一些权衡:

+---------------------------+-------------------+------+--------+--------+------------------------+ | Approach | Example | Easy | Simple | Secure | Separation of Concerns | +---------------------------+-------------------+------+--------+--------+------------------------+ | Config management system | Azure DevOps | | | X | X | | Private repo: unencrypted | Cleartext secrets | X | X | | | | Private repo: encrypted | git-secret | | X | X | | | Secret manager | Azure Key Vault | | | X | X | +---------------------------+-------------------+------+--------+--------+------------------------+ +---------------------------+-------------------+------+--------+--------+------------------------+ |方法|示例|简单|安全|关注点分离| +---------------------------+-------------------+------+--------+--------+------------------------+ |配置管理系统| Azure DevOps | | | X | X| |私人回购:未加密的|明文机密| X | X || |私人回购:加密的| git secret | X | X || |秘密管理者| Azure密钥库| | | X | X| +---------------------------+-------------------+------+--------+--------+------------------------+

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

不要忘记:如果您有免费的git帐户(如果您使用github),您的存储库将对everybodyno可见。我们使用git的专用服务器这在某种程度上是基于意见的-在我的公司,我们在一个单独的git repo中拥有密钥库,我们将其用作android项目中的git子模块。到目前为止,这是一个很好的解决方案。@mao:你能选择我正确的答案吗?这里也解释了:如果只有一个人丢失了密钥库(例如磁盘损坏),那么你必须上传一个新的应用程序,老用户无法更新他们的应用程序。我们的团队在private repo中提交密钥库,但签名信息(storepass、keyalias、keypass)是私有的。@Ninja:我们总是至少制作密钥库文件的两个副本:)我不明白为什么共享jks文件不是好的做法。无论谁使用它来签署apk,都需要拥有密码和jks文件的别名。如果您不存储这些密钥,您是安全的,对吗?今天这可能是一个首选,因为您可以使用工具加密/解密密钥库。另一种方法是将其推送到S3存储桶,并在需要时从那里下载文件(例如CI)