【AOSP】生成签名文件release key,通过Android源码对apk进行签名
简介
现在apk都需要签名,Flutter做的项目官方规定编译apk必须签名。
签名的好处:
- 应用来源验证: 应用签名允许Android系统验证应用的来源。每个应用都使用开发者的私钥进行签名,而应用的签名信息包含在应用的APK文件中。当用户尝试安装应用时,系统会检查应用的签名,以确保它与系统中已知的相匹配。
- 应用完整性验证: 应用签名有助于确保应用在传输过程中没有被篡改。如果应用在传输过程中被修改,其签名将失效,系统会拒绝安装或运行该应用。
- 权限声明: 应用签名也与应用的权限声明相关。Android系统使用应用签名来确保应用对敏感系统资源和API的访问受到控制。如果应用的签名与其声明的权限不匹配,系统会拒绝授予应用相应的权限。
- 防止重放攻击: 应用签名可以防止重放攻击,因为攻击者无法将已签名应用的部分替换为其他内容而不影响签名的有效性
相关文档
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。每个密钥用于签署不同类型的应用或组件,具有不同的权限和用途。
- testkey:
类型: 开发和测试使用。
特点: 通常用于开发和测试阶段,不是用于生产环境。应用使用 testkey 签名时,系统会将其标记为测试版本,通常会有一些限制,例如无法安装在未解锁的设备上。 - platform:
类型: Android平台的系统应用。
特点: 用于签署Android平台的系统应用,这些应用是由设备制造商提供的预装应用。这种签名允许应用访问系统的一些敏感权限和功能,而这些权限通常不允许其他应用获得。 - shared:
类型: 平台的共享系统库。
特点: 主要用于签署Android平台上的共享系统库,这些库可以由多个应用共享。共享库可以提供一组通用的功能,供系统上的多个应用使用。这使得库可以更好地重用,减少重复的代码。 - 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。
- 在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)))
- 在具体产品的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
+
- 修改/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
- 验证打包编译好的系统使用的签名
编译完成之后也可以在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)测试功能:通过入学…...
朴素贝叶斯入门:原理与实例详解
朴素贝叶斯是一种基于贝叶斯定理的简单但强大的概率分类算法。 其核心思想是:通过计算一个数据点属于各个类别的概率,然后将它分到概率最大的那个类别中。 它之所以被称为“朴素”,是因为它做了一个非常强(通常不现实࿰…...
终极动画观看体验:Hanime1Plugin Android插件完整指南
终极动画观看体验:Hanime1Plugin Android插件完整指南 【免费下载链接】Hanime1Plugin Android插件(https://hanime1.me) (NSFW) 项目地址: https://gitcode.com/gh_mirrors/ha/Hanime1Plugin Hanime1Plugin 是一款专为Android用户设计的动画观看增强插件&am…...
多类别不平衡分类问题与SMOTE技术实践
1. 多类别不平衡分类问题概述在机器学习实践中,我们经常会遇到类别分布不均衡的分类问题。这类问题中,某些类别的样本数量可能远多于其他类别,导致模型训练时倾向于忽略少数类。虽然大多数关于不平衡分类的研究都集中在二分类问题上ÿ…...
【电力系统】基于粒子群算法PSO的太阳能风能水力混合抽水蓄能系统研究附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...
服务型AI设计:从自助陷阱到智能服务革命
1. 技术演进与人类角色的转变人类与技术的关系始终处于动态变化之中。从最初的工具使用者到如今的服务提供者,这种角色转换背后隐藏着深刻的技术哲学思考。早期技术产品如电报、电话需要专业操作人员作为中介,这种模式在20世纪中期开始发生根本性转变。1…...
给 AI Agent 装上一双会看网页的眼睛:Dokobot Skill 体验
如果你最近也在折腾 AI agent,大概率会遇到一个很现实的问题: 很多 agent 看起来会“上网”,其实只是会发 HTTP 请求。 这在简单页面上问题不大,但一旦网页是前端渲染的,或者需要登录、滚动、交互,这种能…...
Java原生镜像内存调试黑科技(GraalVM 23.1+专属):jcmd + native-image-debuginfo + heapdump-to-native converter三件套实战
第一章:Java原生镜像内存调试黑科技(GraalVM 23.1专属):jcmd native-image-debuginfo heapdump-to-native converter三件套实战GraalVM 23.1 起正式支持原生镜像(Native Image)的运行时内存调试能力&…...
PyTorch对抗训练超快
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 PyTorch对抗训练的超快实现:从理论到实践的效率革命目录PyTorch对抗训练的超快实现:从理论到实践的效率革…...
从扑克牌到算法:用C++ std::shuffle实现一个公平的在线抽奖系统(附完整代码)
从扑克牌到算法:用C std::shuffle实现一个公平的在线抽奖系统(附完整代码) 想象一下这样的场景:一场电商直播中,主播宣布"现在开始抽奖!"——屏幕瞬间被弹幕淹没,而系统需要在毫秒级响…...
ESP32-CAM保姆级环境配置:从Arduino IDE安装到第一个摄像头程序跑通(避坑指南)
ESP32-CAM零基础实战指南:从环境搭建到视频流监控 第一次拿到ESP32-CAM这个小巧的物联网摄像头模块时,我和大多数初学者一样既兴奋又忐忑。兴奋的是它集成了Wi-Fi和摄像头功能,价格却不到百元;忐忑的是网上各种教程提到的"开…...
