如果我的文章对您有所帮助,欢迎 👍 , 我的Github.
android-kit 致力于为android关键场景提供解决方案。
1. 前言
应用安全是一个全面的防范体系,不能仅仅只关注于编码这部分。
keystore是android app安全的基石,想象一下:如果你现在项目的keystore泄漏了,那是什么灾难。
- 别人可以在各大应用商店中认领你的app,发布盗版app。
- 你的第三方服务(推送、支付、统计等待)都可能被他人盗用。
- 公司的keystore往往是多个项目共享的,一个项目丢失影响面极大。
2. 如何解决?
在运维中有一个概念:最小权限原则。 一个东西经手的人越少,相对越安全。
android中,常见的keystore配置有几种方案
- keystore文件配置在当前工程中,password信息写在gradle文件中。
- keystore文件配置在当前工程中,password信息写在local.properties文件中。
- keystore文件、password信息配置在本机某个目录下。
这几个方案都有些明显的问题
- keystore文件和password信息会被项目人员获取。
- 开发环境 windows mac linux(ci) 路径不太容易保持一致,需要兼容。
解决方案:
项目中配置一个dev的keystore,开发中所有人员都只使用dev signingConfigs。
构建生产包
-
release不配置signingConfigs,编译出一个(些)未签名的apk包 通过
jarsigner -verbose -keystore $KEYFILE -signedjar android-release.apk android-release-unsigned.apk $KEY_ALIAS命令重新签名。 -
release配置dev的signingConfigs 通过
gradlew assembleRelease -Pandroid.injected.signing.store.file=$KEYFILE -Pandroid.injected.signing.store.password=$STORE_PASSWORD -Pandroid.injected.signing.key.alias=$KEY_ALIAS -Pandroid.injected.signing.key.password=$KEY_PASSWORD命令打包,替换dev signingConfigs。 其中$KEYFILE为绝对路径,gradlew assembleRelease可以换成任意buildType。
这俩种方式都可以直接放在ci服务中,也可以让负责人本机打包。