一、签名的作用
安卓应用签名是一种确保应用的完整性和真实性的机制。当开发者创建一个安卓应用程序时,他们需要为该应用程序生成一个数字签名。在向应用商店或其他用户分发应用程序之前,签名将被验证,以确保应用程序没有被篡改或恶意修改。 安卓应用签名的原理是基于公钥密码学的概念。签名是使用开发者的私钥对应用程序进行加密生成的,然后在分发应用程序时将公钥与应用程序一起提供给用户。当用户安装应用程序时,系统会使用公钥对应用程序进行验证,以确保它没有被篡改。
下面是安卓应用签名的一些详细介绍:
- 数字签名:安卓应用签名是使用开发者的私钥对应用程序进行数字签名的过程。私钥只有开发者才能拥有,因此可以确保签名的唯一性和真实性。
- 完整性验证:安卓系统会在安装或更新应用程序时对应用进行完整性验证。它会检查应用程序的签名是否与安装包中的签名相匹配,以确定应用程序是否被篡改或修改。
- 防止篡改:应用签名可以防止未经授权的人员对应用程序进行篡改。只有使用开发者的私钥才能正确地进行签名,因此任何对应用程序的篡改都会导致签名验证失败。
- 可信来源:签名还可以用来验证应用程序的来源是否可信。如果签名验证失败,系统会警告用户不要安装该应用程序,因为它可能来自一个不受信任的来源。
- 应用商店验证:当开发者将应用程序提交给应用商店时,商店会对应用程序进行签名验证。只有在签名验证通过的情况下,商店才会将应用程序提供给用户下载和安装。
- 自动更新:如果应用程序已经安装在用户设备上,而开发者发布了一个新的应用程序版本,系统会自动进行签名验证,并提示用户更新。这确保了用户安装的始终是最新且经过验证的应用程序。 总的来说,安卓应用签名是一种确保应用程序完整性和真实性的机制。它能够防止应用程序被篡改、验证应用程序的来源是否可信,并帮助用户安全地使用和更新应用程序。
android签名.jks和.keystore文件的区别:
-
格式不同:.jks文件是Java KeyStore格式,而.keystore文件是Java密钥库格式。
-
加密方式不同:.jks文件使用的是JCEKS加密方式,而.keystore文件使用的是JKS加密方式。
-
安全性不同:.jks文件的安全性更高,因为它使用了更强的加密方式。
-
支持的算法不同:.jks文件支持更多的算法,包括AES、DES、Triple DES和RSA等,而.keystore文件只支持RSA算法。
二、系统签名有什么用
- 拥有系统签名的app可以执行第三方App不能执行的Api(需要导入framework模块的java包)
- 能够更容易实现进程保活,不被系统杀死
- 能够拥有更多的权限,很多时候直接不用去动态获取权限,免去了权限判断的逻辑
三、系统签名都有哪些
- platform: Android 平台签名密钥,用于签署 Android 系统的核心组件,如系统服务和系统应用程序。
- shared: 共享签名密钥,用于签署由同一开发者发布的不同应用程序。具有相同签名密钥的应用程序可以共享相同的用户 ID 和权限。
- testkey: 测试签名密钥,用于签署测试版本的应用程序。这些应用程序不能发布到 Google Play 商店。
- media: 媒体签名密钥,用于签署媒体框架相关的组件和应用程序。
- networkstack: 网络栈签名密钥,用于签署与网络连接相关的组件和应用程序。
四、制作系统签名
- 下载 keytool-importkeypair签名工具到本地(Ubuntu中)
- 将keytool-importkeypair文件添加到Path中
- 进入系统源码下的
build/target/product/security路径,执行:
keytool-importkeypair -k ./platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
然后就能看到生成的platform.keystore文件的存在了,这个就是我们所需要的系统签名
参数解读:
-k: 表示要生成的 keystore 文件的名字,这里命名为 platform.keystore
-p: 表示要生成的 keystore 的密码,这里是 android
-pk8: 表示要导入的 platform.pk8 文件
-cert: 表示要导入的platform.x509.pem -alias 表示给生成的 platform.keystore 取一个别名,这是命名为 platform
五、使用系统签名
把生成的签名文件 platform.keystore 拷贝到 Android Studio 项目的 app 目录下
第一种方式
在 app/build.gradle 中添加签名的配置信息:
android {
signingConfigs {
sign {
storeFile file('platform.keystore')
storePassword 'android'
keyAlias = 'platform'
keyPassword 'android'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.sign
}
debug {
minifyEnabled false
signingConfig signingConfigs.sign
}
}
}
在项目的 AndroidManifest.xml 中添加:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserId="android.uid.system">
第二种方式
点击File -> Project Structure
点击Signing Configs配置签名
点 + 号,我们新创建个签名,命名我这里就起platform了
这里的Store Password 和 Key Password 就填我们生成的 keystore 的密码 —— android
新增了签名之后,我们可以配置在release还是debug的时候使用这个签名,这里以debug为例,release也是同理
点击应用之后我们可以看到build.gradle里面生成了这些代码
最后在项目的 AndroidManifest.xml 中添加:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserId="android.uid.system">
其实这两种方式都是大同小异,区别是一个是手动输入代码,另一个是由工具帮助生成
六、apk签名迭代
除了有系统的签名,还有apk的签名,在此我也做个笔记,截止到目前已经有APK v1-v4,apk签名从APK v1到APK v2改动很大,而APK v3只是对APK v2的一次升级,APK v4则是一个补充
APK v1:
基于签名的 Jar 包的方案,但是有如下两个缺陷:
-
有篡改的风险:
META-INF目录用来存放签名,自然此目录本身是不计入签名校验过程的,可以随意在这个目录中添加文件,比如一些快速批量打包方案就选择在这个目录中添加渠道文件。 -
apk 校验速度慢:校验过程中需要对 apk 中所有文件进行解压和摘要计算( SHA-256 ),在 APK 资源很多、性能较差的机器上签名校验会花费较长时间,导致安装速度慢。
APK v2:(Android 7.0 引入)
- 对整个 apk 进行签名(通过二进制流运算出哈希值),解决了 v1 带来的问题。v2 签名会在 apk 块中新增一个签名块,里面中存储了签名、签名算法、摘要等。一个签名块还可以包含多个 id 和 value,apk 的签名信息会存放在 ID 为
0x7109871a的键值对里,而 美团多渠道打包(瓦力) 正是直接将渠道信息通过添加到签名块的 id 和 value 中
APK v3:(Android 9.0 引入)
- 在 v2 的签名块里面添加了一个 ID 为
0xf05368c0的新块(证书块),在这里支持添加多个签名证书(可以看成单链表),由此来做证书替换和升级。
APK v4: (Android 11 中引入)
-
Android 11 通过 APK 签名方案 v4 支持与流式传输兼容的签名方案。v4 签名基于根据 APK 的所有字节计算得出的 Merkle 哈希树。它完全遵循 fs-verity 哈希树的结构(例如,对salt进行零填充,以及对最后一个分块进行零填充。)Android 11 将签名存储在单独的 .apk.idsig 文件中。v4 签名需要 v2 或 v3 签名作为补充。
-
APK v4同样是为了新功能而出现的,这个新功能就是ADB 增量 APK 安装
七、Android Studio生成签名文件
- Key store path : 签名文件路径
- Password : 签名密码
- Confirm : 确认密码
- Alias : 别名
- Validity ( years ) : 有限期 (年)
- First and Last Name : 全名
- Organizational Unit : 组织单位
- Organization : 组织
- City or Locality : 城市或地方
- State or Province : 州或省
- Country Code(XX) : 国家代码 (中国:86)
点击OK就可以看到了
模板范例:
感谢
写给应用开发的 Android Framework 教程——玩转 AOSP 篇之使用 Android Studio 开发系统 App - 掘金 (juejin.cn)
细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4 - 掘金 (juejin.cn)