aosp-制作系统签名及签名相关知识

1,146 阅读7分钟

一、签名的作用

安卓应用签名是一种确保应用的完整性和真实性的机制。当开发者创建一个安卓应用程序时,他们需要为该应用程序生成一个数字签名。在向应用商店或其他用户分发应用程序之前,签名将被验证,以确保应用程序没有被篡改或恶意修改。 安卓应用签名的原理是基于公钥密码学的概念。签名是使用开发者的私钥对应用程序进行加密生成的,然后在分发应用程序时将公钥与应用程序一起提供给用户。当用户安装应用程序时,系统会使用公钥对应用程序进行验证,以确保它没有被篡改。

下面是安卓应用签名的一些详细介绍:

  1. 数字签名:安卓应用签名是使用开发者的私钥对应用程序进行数字签名的过程。私钥只有开发者才能拥有,因此可以确保签名的唯一性和真实性。
  2. 完整性验证:安卓系统会在安装或更新应用程序时对应用进行完整性验证。它会检查应用程序的签名是否与安装包中的签名相匹配,以确定应用程序是否被篡改或修改。
  3. 防止篡改:应用签名可以防止未经授权的人员对应用程序进行篡改。只有使用开发者的私钥才能正确地进行签名,因此任何对应用程序的篡改都会导致签名验证失败。
  4. 可信来源:签名还可以用来验证应用程序的来源是否可信。如果签名验证失败,系统会警告用户不要安装该应用程序,因为它可能来自一个不受信任的来源。
  5. 应用商店验证:当开发者将应用程序提交给应用商店时,商店会对应用程序进行签名验证。只有在签名验证通过的情况下,商店才会将应用程序提供给用户下载和安装。
  6. 自动更新:如果应用程序已经安装在用户设备上,而开发者发布了一个新的应用程序版本,系统会自动进行签名验证,并提示用户更新。这确保了用户安装的始终是最新且经过验证的应用程序。 总的来说,安卓应用签名是一种确保应用程序完整性和真实性的机制。它能够防止应用程序被篡改、验证应用程序的来源是否可信,并帮助用户安全地使用和更新应用程序。

android签名.jks和.keystore文件的区别:

  1. 格式不同:.jks文件是Java KeyStore格式,而.keystore文件是Java密钥库格式。

  2. 加密方式不同:.jks文件使用的是JCEKS加密方式,而.keystore文件使用的是JKS加密方式。

  3. 安全性不同:.jks文件的安全性更高,因为它使用了更强的加密方式。

  4. 支持的算法不同:.jks文件支持更多的算法,包括AES、DES、Triple DES和RSA等,而.keystore文件只支持RSA算法。

二、系统签名有什么用

  1. 拥有系统签名的app可以执行第三方App不能执行的Api(需要导入framework模块的java包)
  2. 能够更容易实现进程保活,不被系统杀死
  3. 能够拥有更多的权限,很多时候直接不用去动态获取权限,免去了权限判断的逻辑

三、系统签名都有哪些

  1. platform: Android 平台签名密钥,用于签署 Android 系统的核心组件,如系统服务和系统应用程序。
  2. shared: 共享签名密钥,用于签署由同一开发者发布的不同应用程序。具有相同签名密钥的应用程序可以共享相同的用户 ID 和权限。
  3. testkey: 测试签名密钥,用于签署测试版本的应用程序。这些应用程序不能发布到 Google Play 商店。
  4. media: 媒体签名密钥,用于签署媒体框架相关的组件和应用程序。
  5. networkstack: 网络栈签名密钥,用于签署与网络连接相关的组件和应用程序。

四、制作系统签名

  1. 下载 keytool-importkeypair签名工具到本地(Ubuntu中)
  2. 将keytool-importkeypair文件添加到Path中
  3. 进入系统源码下的build/target/product/security路径,执行:
keytool-importkeypair -k ./platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform

然后就能看到生成的platform.keystore文件的存在了,这个就是我们所需要的系统签名 image.png

参数解读:

-k: 表示要生成的 keystore 文件的名字,这里命名为 platform.keystore

-p: 表示要生成的 keystore 的密码,这里是 android

-pk8: 表示要导入的 platform.pk8 文件

-cert: 表示要导入的platform.x509.pem -alias 表示给生成的 platform.keystore 取一个别名,这是命名为 platform

五、使用系统签名

把生成的签名文件 platform.keystore 拷贝到 Android Studio 项目的 app 目录下

Snipaste_2023-08-16_11-42-21.png

第一种方式

在 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

Snipaste_2023-08-16_11-42-39.png

点击Signing Configs配置签名

Snipaste_2023-08-16_11-43-15.png

点 + 号,我们新创建个签名,命名我这里就起platform了

Snipaste_2023-08-16_11-46-42.png

这里的Store Password 和 Key Password 就填我们生成的 keystore 的密码 —— android

Snipaste_2023-08-16_13-33-51.png

新增了签名之后,我们可以配置在release还是debug的时候使用这个签名,这里以debug为例,release也是同理

Snipaste_2023-08-16_11-47-57.png

点击应用之后我们可以看到build.gradle里面生成了这些代码

image.png

最后在项目的 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生成签名文件

Snipaste_2023-08-16_14-39-44.png

Snipaste_2023-08-16_14-39-59.png

Snipaste_2023-08-16_14-40-23.png

Snipaste_2023-08-16_14-40-30.png

  • 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就可以看到了

模板范例:

image.png

感谢

写给应用开发的 Android Framework 教程——玩转 AOSP 篇之使用 Android Studio 开发系统 App - 掘金 (juejin.cn)

细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4 - 掘金 (juejin.cn)

Android 逆向入门保姆级教程 - 掘金 (juejin.cn)