当前位置: 首页 > news >正文

【AOSP】生成签名文件release key,通过Android源码对apk进行签名

简介

现在apk都需要签名,Flutter做的项目官方规定编译apk必须签名。
签名的好处:

  1. 应用来源验证: 应用签名允许Android系统验证应用的来源。每个应用都使用开发者的私钥进行签名,而应用的签名信息包含在应用的APK文件中。当用户尝试安装应用时,系统会检查应用的签名,以确保它与系统中已知的相匹配。
  2. 应用完整性验证: 应用签名有助于确保应用在传输过程中没有被篡改。如果应用在传输过程中被修改,其签名将失效,系统会拒绝安装或运行该应用。
  3. 权限声明: 应用签名也与应用的权限声明相关。Android系统使用应用签名来确保应用对敏感系统资源和API的访问受到控制。如果应用的签名与其声明的权限不匹配,系统会拒绝授予应用相应的权限。
  4. 防止重放攻击: 应用签名可以防止重放攻击,因为攻击者无法将已签名应用的部分替换为其他内容而不影响签名的有效性

相关文档

Android标准签名key文件位于源码的如下位置:/build/target/product/security/README
这个README 给出了相关说明:

For detailed information on key types and image signing, please see:https://source.android.com/devices/tech/ota/sign_builds.htmlThe test keys in this directory are used in development only and should
NEVER be used to sign packages in publicly released images (as that would
open a major security hole).key generation
--------------The following commands were used to generate the test key pairs:development/tools/make_key testkey  '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key shared   '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key media    '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'signing using the openssl commandline (for boot/system images)
--------------------------------------------------------------1. convert pk8 format key to pem format% openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem2. create a signature using the pem format key% openssl dgst -binary -sha1 -sign testkey.pem FILE > FILE.sigextracting public keys for embedding
------------------------------------dumpkey.jar is a Java tool that takes an x.509 certificate in PEM format as
input and prints a C structure to standard output:$ java -jar out/host/linux-x86/framework/dumpkey.jar build/target/product/security/testkey.x509.pem{64,0xc926ad21,{1795090719,2141396315,950055447,2581568430,4268923165,1920809988,546586521,3498997798,1776797858,3740060814,1805317999,1429410244,129622599,1422441418,1783893377,1222374759,2563319927,323993566,28517732,609753416,1826472888,215237850,4261642700,4049082591,3228462402,774857746,154822455,2497198897,2758199418,3019015328,2794777644,87251430,2534927978,120774784,571297800,3695899472,2479925187,3811625450,3401832990,2394869647,3267246207,950095497,555058928,414729973,1136544882,3044590084,465547824,4058146728,2731796054,1689838846,3890756939,1048029507,895090649,247140249,178744550,3547885223,3165179243,109881576,3944604415,1044303212,3772373029,2985150306,3737520932,3599964420},{3437017481,3784475129,2800224972,3086222688,251333580,2131931323,512774938,325948880,2657486437,2102694287,3820568226,792812816,1026422502,2053275343,2800889200,3113586810,165549746,4273519969,4065247892,1902789247,772932719,3941848426,3652744109,216871947,3164400649,1942378755,3996765851,1055777370,964047799,629391717,2232744317,3910558992,191868569,2758883837,3682816752,2997714732,2702529250,3570700455,3776873832,3924067546,3555689545,2758825434,1323144535,61311905,1997411085,376844204,213777604,4077323584,9135381,1625809335,2804742137,2952293945,1117190829,4237312782,1825108855,3013147971,1111251351,2568837572,1684324211,2520978805,367251975,810756730,2353784344,1175080310}}This is called by build/make/core/Makefile to incorporate the OTA signing keys
into the recovery image.

四种key

可以看到在Android系统中,有四种常见的签名密钥,分别是testkey、platform、shared和media。每个密钥用于签署不同类型的应用或组件,具有不同的权限和用途。

  1. testkey:
    类型: 开发和测试使用。
    特点: 通常用于开发和测试阶段,不是用于生产环境。应用使用 testkey 签名时,系统会将其标记为测试版本,通常会有一些限制,例如无法安装在未解锁的设备上。
  2. platform:
    类型: Android平台的系统应用。
    特点: 用于签署Android平台的系统应用,这些应用是由设备制造商提供的预装应用。这种签名允许应用访问系统的一些敏感权限和功能,而这些权限通常不允许其他应用获得。
  3. shared:
    类型: 平台的共享系统库。
    特点: 主要用于签署Android平台上的共享系统库,这些库可以由多个应用共享。共享库可以提供一组通用的功能,供系统上的多个应用使用。这使得库可以更好地重用,减少重复的代码。
  4. media:
    类型: 用于签署媒体库。
    特点: 主要用于签署Android平台上的媒体库,这些库提供音频和视频处理功能。这样的签名允许库访问系统上的音频和视频资源,这对于多媒体应用和功能非常重要。

应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定哪个key签名,未指定的默认用testkey。
Android.bp中为:certificate: “platform”。build/target/product/security目录下查看:

在这里插入图片描述
.pk8代表私钥,.x509.pem公钥,它们都是成对出现。

生成key

从README可知,key是通过development/tools目录下的make_key脚本生成的,脚本需要传入两个参数。其中第一个参数是key的名字,我们可以不修改,使用aosp默认的4个key的名字;第二个参数即是具体的一些属性,此为key真正的关键(我们需要修改的部分),下面对第二个参数的一些具体属性做出分析解释:

C> Country Name (2 letter code) #国家名称(2 个字母代码)
ST> State or Province Name (full name) #州或省名称(全名)
L> Locality Name (eg, city) #地区名称(例如,城市)
O> Organization Name (eg, company) #组织名称(例如,公司)
OU> Organizational Unit Name (eg, section) #组织单位名称(例如,部分)
CN> Common Name (eg, your name or your server’s hostname) #通用名称(例如,您的姓名或服务器的主机名)
emailAddress —> Contact email address #联系电子邮件地址

因此,在生成key 的时候我们只需要AOSP的根目录使用以下命令,注意替换面的内容为自己的信息。

  development/tools/make_key testkey  '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key shared   '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'development/tools/make_key media    '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

值得注意的是用make_key生成key的过程中会提示输入password,可以不输入,直接enter。
生成之后我将这些key都放在了vendor/xxxx/android-certs/releasekey路径下

验证key

在生成key后,再使用OpenSSL的工具来验证一下生成的key是否正常进入到/build/target/product/security目录,执行如下命令:

openssl x509 -noout -subject -issuer -in platform.x509.pem 

执行后正确输出你的参数信息即可

修改系统默认签名key

在上面提到如果apk中的编译选项LOCAL_CERTIFICATE没有设置的话,就会使用默认的testkey作为签名key,我们可以修改成自己想要的key,按照上面的步骤制作一个releasekey。

  1. 在build/make/core/Makefile中增加如下内容
--- a/build/make/core/Makefile
+++ b/build/make/core/Makefile
@@ -328,6 +328,12 @@ BUILD_KEYS := test-keyselseBUILD_KEYS := dev-keysendif
+
+# Here is a customization of which key signature to use
+ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),vendor/xxxx/android-certs/releasekey)
+BUILD_KEYS := release-keys
+endif
+BUILD_VERSION_TAGS += $(BUILD_KEYS)BUILD_VERSION_TAGS := $(subst $(space),$(comma),$(sort $(BUILD_VERSION_TAGS)))
  1. 在具体产品的mk中增加如下内容,vendor/xxxx/android-certs/releasekey为我存放各种key的路径
--- a/device/amlogic/ohm/ohm.mk
+++ b/device/amlogic/ohm/ohm.mk
@@ -424,3 +424,7 @@ endifPRODUCT_PACKAGES += \Settings \SettingsIntelligence
+
+# android sign key
+PRODUCT_DEFAULT_DEV_CERTIFICATE := vendor/xxxx/android-certs/releasekey
+
  1. 修改/system/sepolicy/prebuilts/api/30.0/private/keys.conf下的内容
--- a/system/sepolicy/prebuilts/api/30.0/private/keys.conf
+++ b/system/sepolicy/prebuilts/api/30.0/private/keys.conf
@@ -22,7 +22,7 @@ ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/shared.x509.pem# Example of ALL TARGET_BUILD_VARIANTS[@RELEASE]
-ENG       : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
-USER      : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
-USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
+ENG       : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
+USER      : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
+USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
4. 修改/system/sepolicy/private/keys.conf下的内容
--- a/system/sepolicy/private/keys.conf
+++ b/system/sepolicy/private/keys.conf
@@ -22,7 +22,7 @@ ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/shared.x509.pem# Example of ALL TARGET_BUILD_VARIANTS[@RELEASE]
-ENG       : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
-USER      : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
-USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
+ENG       : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
+USER      : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
+USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem
  1. 验证打包编译好的系统使用的签名
    编译完成之后也可以在build.prop中查看到变量:
adb root
adb remount
adb shell
cd system
cat build.prop

会看到一行ro.build.tags=release-keys。
6. 生成 generate_verity_key
首先:

make generate_verity_key (mmm system/extras/verity/)

然后执行:

out/host/linux-x86/bin/generate_verity_key -convert build/target/product/security/verity.x509.pem  verity_key

重命名verity_key.pub为verity_key拷贝至build/target/product/security/ 目录,替换相应的 key。
根据以上步骤把生成的相应的key替换系统中build/target/product/security/ 目录下的key后重新编译系统,即可使用自己生成的系统签名key。

系统key文件生成keystore

生成keystore文件主要是给外部apk开发签名使用的;
以常用的platform签名为例:
如果之前没有生成platform.pem文件,现在可以执行以下命令生成:

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.pem -nocryp

生成platform.p12文件,设置对应的密码和alias名:([yourname]为自定义的aliasname,回车之后输入密码)

openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.pk12 -name [yourname]

生成platform.keystore:(需要JDK8以上版本,使用JDK8会报错,[yourname]为自定义的aliasname,回车之后输入密码,[password]为上一步输入的密码)

keytool -importkeystore -destkeystore platform.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass [password] -alias [yourname]

最终的platform.keystore即为我们所要的keystore。

AndroidStudio导入生成的keystore文件

将生成的platform.keystore放在AndroidStudio创建的项目的app/路径下
如图编辑build.gradle文件:

android {signingConfigs {main {storeFile file("platform.keystore") //keystore文件路径storePassword "password"  //密钥密码keyAlias "yourname"  //key别名keyPassword "password"  //key密码}}buildTypes {debug {minifyEnabled falsesigningConfig signingConfigs.mainproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}release {minifyEnabled falsesigningConfig signingConfigs.mainproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}

之后clean peoject之后重新build apk并且install,apk即可拥有platform签名。

将编译好的apk进行系统签名

首先确认你的/build/make/target/product/security/目录下有.pem和.pk8的签名文件,然后确认有签名工具prebuilts/sdk/tools/lib/signapk.jar
然后将你要签名的apk放在在AOSP根目录使用以下命令,替换app.apk为你的apk名,替换app_signed.apk为你想要签完名的apk的名字。

java -Djava.library.path="prebuilts/sdk/tools/linux/lib64" -jar ./prebuilts/sdk/tools/lib/signapk.jar ./build/make/target/product/security/platform.x509.pem ./build/make/target/product/security/platform.pk8 app.apk app_signed.apk

参考

生产key:
Android系统签名生成&Studio导入系统keystore
签名key:
通过Android源码对apk进行签名

相关文章:

【AOSP】生成签名文件release key,通过Android源码对apk进行签名

简介 现在apk都需要签名,Flutter做的项目官方规定编译apk必须签名。 签名的好处: 应用来源验证: 应用签名允许Android系统验证应用的来源。每个应用都使用开发者的私钥进行签名,而应用的签名信息包含在应用的APK文件中。当用户尝…...

深度学习之基于Tensorflow银行卡号码识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介银行卡号码识别的步骤TensorFlow的优势 二、功能三、系统四. 总结 一项目简介 # 深度学习基于TensorFlow的银行卡号码识别介绍 深度学习在图像识别领域取得…...

第95步 深度学习图像目标检测:Faster R-CNN建模

基于WIN10的64位系统演示 一、写在前面 本期开始,我们学习深度学习图像目标检测系列。 深度学习图像目标检测是计算机视觉领域的一个重要子领域,它的核心目标是利用深度学习模型来识别并定位图像中的特定目标。这些目标可以是物体、人、动物或其他可识…...

设计模式—里氏替换原则

1.概念 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影…...

PyTorch包

进入PyTorch的官网: pytorch GitHub 点击GitHub: 进入PyTorch的主目录: 进入Vision reference: detection: 这就是我们在训练过程中会使用到的文件了:...

22、什么是中间件和权限拦截中间件实操

新建中间件 middleware\auth.js // 定义权限判断中间件,中间件的第一个参数是context export default ({store, redirect}) > {console.log("中间件被调用")// if (!store || !store.state.userinfo) {// redirect("/")// } }页面使用…...

vue.config.js

proxy代理 proxy选项用于配置开发服务器的代理。下面是proxy的全部属性: 1. target (String | Object | Function): 指定要代理的目标主机的URL。可以是一个字符串,也可以是一个对象或函数,用于动态返回目标URL。 2. forward (Boolean): 控…...

80C51单片机----数据传送类指令

目录 一.一般传送指令,即mov指令 1.16位传送(仅1条) 2.8位传送 (1)目的字节为A(累加器) (2)目的字节为Rn(工作寄存器) (3)目的字节为direct…...

【Golang】使用泛型对数组进行去重

背景: 要求写一个方法,返回去重后的数组。数组的类型可能是int64,也可能是string,或是其他类型。 如果区分类型的话,每增加一个新的类型都需要重新写一个方法。 示例代码: //对int64数组进行去重 func DeD…...

Ps:画笔工具的基本操作

画笔工具 Brush Tool是 Ps 中最常用的工具,广泛地用于绘画与修饰工作。 虽然多数操作可在画笔工具的工具选项栏中选择执行,但是如果能记住相应的快捷键可大大提高工作效率。 熟练掌握画笔工具的操作对于使用其他工具也非常有益,因为 Ps 中许多…...

【Apache Doris】一键实现万表MySQL整库同步 | 快速体验

【Apache Doris】一键实现万表MySQL整库同步 | 快速体验) 一、 环境信息1.1 硬件信息1.2 软件信息 二、 流程介绍三、 前提概要3.1 安装部署3.2 JAR包准备3.2.1 数据源3.2.2 目标源 3.3 脚本模版 四、快速体验五、常见问题5.1 Mysql通信异常5.2 MySQL无Key同步异常5…...

35.逻辑运算符

目录 一.什么是逻辑运算符 二.C语言中的逻辑运算符 三.逻辑表达式 三.视频教程 一.什么是逻辑运算符 同时对俩个或者俩个以上的表达式进行判断的运算符叫做逻辑运算符。 举例:比如去网吧上网,只有年满十八周岁并且带身份证才可以上网。在C语言中如果…...

ASP.NET Core 启用CORS

浏览器的安全阻止一个域的本地页面请求另外不同域的本地页面,这个限制叫同源策略,这个安全特性用来阻止恶意站点从别的网站读取数据 例如假如我有一个页面叫A.html https://foo.example/A.html 现在页面A.html有一个ajax代码尝试读取B.html的HTML的源…...

io.lettuce.core.RedisCommandExecutionException

io.lettuce.core.RedisCommandExecutionException: ERR invalid password ERR invalid password-CSDN博客 io.lettuce.core.RedisCommandExecutionException /** Copyright 2011-2022 the original author or authors.** Licensed under the Apache License, Version 2.0 (the…...

vue3 导出数据为 excel 文件

文章目录 安装插件封装组件 -- Export2Excel.js多表封装界面使用 -- 数据处理成二维数组更多 菜鸟最近做了一个需求,就是需要上传表单并识别,然后识别出来的内容要可以修改,然后想的就是识别内容变成 form 表单,所以并没有使用 Sp…...

PyQt6简介

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计12条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…...

某60区块链安全之未初始化的存储指针实战二学习记录

系列文章目录 文章目录 系列文章目录未初始化的存储指针实战二实验目的实验环境实验工具实验原理实验内容实验过程EXP利用 未初始化的存储指针实战二 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约未初始化的存储指针漏洞 找到合约漏洞进行分析并形成利用 实验…...

软件工程第十二周

软件作坊、软件危机、软件过程控制、重型控制、敏捷、DevOps 这些术语概括了软件开发历史和实践中的几个重要概念和阶段。让我们逐一解析它们: 软件作坊(Software Craftsmanship):这是软件开发的早期模式,强调个人技能…...

electron 问题记录

23年11月24 electron项目npm install 卡在一个地方不动 原因:主要是 install electron 会卡住 解决方法: # 先解决install electron卡死 npm install -g cnpm --registryhttps://registry.npmmirror.com cnpm install electron# 然后下载其他依赖 np…...

nodejs+vue+python+PHP+微信小程序-留学信息查询系统的设计与实现-安卓-计算机毕业设计

1、用户模块: 1)登录:用户注册登录账号。 2)留学查询模块:查询学校的入学申请条件、申请日期、政策变动等。 3)院校排名:查询国外各院校的实力排名。 4)测试功能:通过入学…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...