【问题标题】:Should I commit release key store for Android app to team repository?我应该将 Android 应用的发布密钥存储提交到团队存储库吗?
【发布时间】:2016-02-20 04:38:27
【问题描述】:

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

【问题讨论】:

  • 不要忘记:如果您有免费的 git 帐户(如果您使用 github),那么每个人都可以看到您的存储库
  • 不,我们使用我们的私有服务器和 git
  • 这有点基于意见 - 在我的公司,我们在一个单独的 git repo 中有密钥库,我们在 android 项目中用作 git 子模块。到目前为止,这是一个很好的解决方案。
  • @mao:你能把我的答案选对吗?

标签: android git android-studio


【解决方案1】:

你不应该。

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, 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
  }
  .
  .
  .
}

查看我的完整演示配置:

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'
}

【讨论】:

  • 如果只有一个人丢失了keystore(例如磁盘损坏),那么你必须上传一个新的应用程序,老用户不能更新他们的应用程序。我们的团队在私有仓库中提交密钥库,但签名信息(storepass、keyalias、keypass)是私有的。
  • @Ninja:我们总是至少制作两个密钥库文件的副本 :)
  • 我不明白为什么共享 jks 文件不是好的做法。谁使用它来签署 apk,需要同时拥有密码和 jks 文件的别名。如果你不存储这些,你就安全了,对吧?
  • 今天这可能是一种偏好,因为您可以使用工具来加密/解密密钥库。另一种方法是将其推送到 S3 存储桶并在需要时从那里下载文件(例如 CI)
【解决方案2】:

继续:

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

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


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

有一些权衡:

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

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

【讨论】:

  • 感谢您提供如此周到的回答和您的比较表!
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多