android apk文件的签名问题
android的APK文件实际上是一个jar文件。jar的意思是瓶、罐,那就意味着jar文件是一个用来存放android应用相关文件的容器。事实上,它也确实如此,它只是一个带或不带压缩的zip文件,当你把.apk后缀改成.zip后,就能对此进行解压了。用java写的不同类型应用都会使用jar来存储它们的文件。jar有一些特殊的结构。
参考:KeyStore文件
1. 编译一个未签名的apk文件
P2PIM % gradlew :app:assembleRelease
我们将在下面的路径找到未签名的apk文件app-release-unsigned.apk:
app/build/outputs/apk/release/app-release-unsigned.apk
2.用.jks对apk进行签名
// --ks 从初始化好的KeyStore加载私钥和证书链,KeyStore的初始化是基于指定的.jks文件的% ./apksigner sign --ks kyunban.jks --out app-release-signed.apk app-release-unsigned.apk
Keystore password for signer #1:
输入.jks的保护密码,就可以完成签名:
% ls
app-release-signed.apk
apksigner
apksigner对给定的apk文件进行签名,它会剥离任何先前存在的签名。
换句话说,当将要进行签名的apk已经签过名了,那么apksigner会把已存在的签名先删除掉,再进行重新签名。
使用一个或多个签名者执行,每个签名者由一个非对称密钥表示
Pair和对应的证书。通常,APK只由一个人签名
签名者。对于每个签名者,需要提供签名者的私钥和
证书。
签名是由一个或多个签名者来完成的,就像一份重要的文件一样,可能是由一个重要的人来签名即可,也可能需要好几个重要的人来共同签名才能有效。在计算机里的签名也是一样的,首先是选择非对称密钥对和相应的证书来完成。私钥是掌握在签名者自己手中,另人是没有的。证书是用来传输对应的公钥。 因为私钥加密的内容只能用其公钥来解密,又因私钥只掌握在签名者自己手中,因此就构成了签名者无法抵赖签名的事实。因此签名者都是要用各自的私钥来进行签名的。
在Android领域,要对apk文件进行签名时,只能用一个签名者的私钥来签名,它不能够联名签名。所以对已签名的apk文件进行重新签名时,它会先把先前的签名剥离掉先,再签名。
所以要对apk签名,签名者必须提供私钥和证书,证书中有私钥对应的公钥。
.jks只是一份存放了相应的私钥、公钥和证书的地方,其实,也可以用类似.jks文件来对apk文件进行签名,apksigner支持的就行,这里列举一些签名的例子:
- 只用keystore文件kyunban.jks中的私钥进行签名:
// 如果不通过--out指定新的文件名,签名的文件也就是app.apk,覆盖掉原先未签名的文件
$ apksigner sign --ks kyunban.jks app.apk
- 只用keystore文件kyunban.jks中的私钥进行签名,签名的文件不覆盖原来未签名的文件
$ apksigner sign --ks kyunban.jks --in app.apk --out app-signed.apk
- 通过.pk8文件中的私钥和证书文件中的证书链一起签名,注意这里要求证书文件格式必须是X.509 PEM 或 DER 格式:
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
- 用两个私钥对apk文件进行签名
$ apksigner sign --ks release.jks --next-signer --ks magic.jks app.apk
- 如果签名时,.jks用的密码字符不是ASCII编码,那么需要通过
--pass-encoding指定密码的字符集,这样就可以使用非ASCII编码的密码了。
$ apksigner sign --ks release.jks --pass-encoding ibm437 app.apk
- 使用 Java Crypto Architecture (JCA) (Java加密体系)签名apk文件,典型的就是用PKCS #11的提供者来签名,这些提供者的类文件要提前安装好,确保在命令行中能够访问到它们:
// --provider-class指定签名的提供者
// --provider-arg指定参数文件,这些参数是传给--provider-class指定的类的
// --ks NONE 不需要keystore文件来提供私钥,这种签名用的是PKCS #11密钥库,即PKCS #11的keystore。
// --key-type指定密钥库即keystore使用的类型或算法,没有指定就用默认的。这里用PKCS11算法
$ apksigner sign --provider-class sun.security.pkcs11.SunPKCS11 --provider-arg token.cfg --ks NONE --ks-type PKCS11 app.apk
- 用轮换签名证书签名apk文件,这个签名方案只在v3中支持。这种签名方式中,签名的历史记录会被使用到。本次签名用到的证书,与上次是不同的。
--lineage指定的就是这个历史记录,这是用apksigner的rotate命令创建的。这个命令的作用就是添加一个新的签名证书到SigningCertificateLineage这个对象。如果使用这种方式签名的话,所有的签名者都必须在signing lineage中。估计比较少人用这种,但无疑它更加安全。
$ apksigner sign --ks release.jks --next-signer --ks release2.jks --lineage /path/to/signing/history/lineage app.apk
相关文章:
android apk文件的签名问题
android的APK文件实际上是一个jar文件。jar的意思是瓶、罐,那就意味着jar文件是一个用来存放android应用相关文件的容器。事实上,它也确实如此,它只是一个带或不带压缩的zip文件,当你把.apk后缀改成.zip后,就能对此进行…...
ATTCK视角下的信息收集:主机发现
目录 1、利用协议主动探测主机存活 利用ICMP发现主机 利用ARP发现主机 利用NetBIOS协议发现主机 利用TCP/UDP发现主机 利用DNS协议发现主机 利用PRC协议发现主机程序 2、被动主机存活检测 利用Browser主机探测存活主机 利用ip段探测主机存活 利用net命令探测主机存活…...
Redis 主从、哨兵和分片集群简单介绍
Redis 主从集群架构 单节点 redis 并发能力有上限,要进一步提高 redis 并发能力,就要搭建主从集群,实现读写分离 主从同步原理 Replicaition id:每台 master 机器都一个 repl_id,是数据集的表示,若 salv…...
群晖NAS+DMS7.0以上版本+无docker机型安装zerotier
测试机型:群晖synology 218play / DSM版本为7.2.1 因218play无法安装docker,且NAS系统已升级为7.0以上版本,按zerotier官网说法无法安装zerotier, 不过还是可以通过ssh终端和命令方式安装zerotier。 1、在DSM新建文件夹 用于存放zerotier脚…...
Pinia持久化存储插件 pinia-plugin-persist
1、pinia-plugin-persist 作用 pinia-plugin-persist是一个Pinia持久化存储插件,用于将Pinia状态存储到本地持久化存储中,例如localStorage或sessionStorage。 2、安装和使用pinia-plugin-persist 有时候需要把pinia中的数据持久化存储(存到…...
链家JAVA笔试题
单选题 1、在Java中下列关于自动类型转换说法正确的是( )。 A. 基本数据类型和String相加结果一定是字符串型 B. char类型和int类型相加结果一定是字符 C. double类型可以自动转换成int D. char int double “ ”结果一定是double 参考答案&am…...
当试图回复传入消息时,消息应用程序会闪烁
问题描述: Actual Results: Unable to reply for incoming message as Messaging app flickers and closes. Expected Results: User should be able to send reply for incoming messages. Reproduction Steps: Stay in home screen. Receive an incoming mes…...
Hubery-个人项目经历记录
研究生期间很有幸的进入到了崔老师的组,从此也就进入到了分析人体生理信号的领域,充满挑战的同时也充满了乐趣。借着CSDN整理一下近几年来参与的项目,这里蕴含着我各种美好的回忆,也作为一个展示自己的平台吧。博客中很多结果只给…...
Ubuntu18.04 安装 qt 5.15.2
一.安装qt 1.下载 在线安装包 使用国内镜像源在线安装QT(2023.3.25更新)_qt国内镜像-CSDN博客 2.安装 (1)QT库安装: 注意:我安装时 勾选 Qt Design studio 会导致报错,直接不勾选。 注意:Qtcreator 无…...
【Linux Shell】6. echo 命令
文章目录 【 1. 显示普通字符串 】【 2. 显示转义字符 】【 3. 显示变量 】【 4. 显示换行 】【 5. 显示不换行 】【 6. 显示命令执行结果 】 Shell 的 echo 指令用于字符串的输出。命令格式: echo string【 1. 显示普通字符串 】 #!/bin/bashecho "It is a …...
Dell 机架式服务器 - 高级定制服务
Dell 机架式服务器 - 高级定制服务 1. Dell Technologies2. 机架式服务器 - 高级定制服务2.1. Servers & Storage (服务器及存储) -> Servers2.2. Rack Servers (机架式服务器)2.3. Shop2.4. PowerEdge Rack Servers (PowerEdge 机架式服务器)2.5. PowerEdge R760 Rack …...
C++ 中关键字 Static
1、什么是static? static 是C中很常用的修饰符,它被用来控制变量的存储方式和可见性。由关键字static修饰类中成员,成为类的静态成员。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。静态…...
系统学习Python——警告信息的控制模块warnings:警告过滤器-[重写默认的过滤器]
分类目录:《系统学习Python》总目录 Python应用程序的开发人员可能希望在默认情况下向用户隐藏所有Python级别的警告,而只在运行测试或其他调试时显示这些警告。用于向解释器传递过滤器配置的sys.warningoptions属性可以作为一个标记,表示是否…...
C++力扣题目-- 二叉树层序遍历
102.二叉树的层序遍历(opens new window)107.二叉树的层次遍历II(opens new window)199.二叉树的右视图(opens new window)637.二叉树的层平均值(opens new window)429.N叉树的层序遍历(opens new window)515.在每个树行中找最大值(opens new window)116.填充每个节点的下一个右…...
前端实现回车键触发搜索
前端实现回车键触发搜索 前言实现方法1. html里可以用 form 来实现2. 非form中的input 前言 搜索框是个常见的功能,除了用现有的ui组件库,有的时候必须要自己封装,所以涉及到点击按钮搜索和回车搜索都要实现 实现方法 1. html里可以用 for…...
k8s yaml文件pod的生命周期
Pod是k8s中最小限额资源管理组件,也是最小化运行容器化的应用的资源管理对象。 Pod是一个抽象的概念,可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。 在一个pod当中同时运行多个容器,在一个pod当中…...
MPEG4Extractor
1、readMetaData 必须要找到 Moov box,找到 Mdat box或者 Moof box,并且创建了 ItemTable 大端 box 分为 box header 和 box content: box header由8个字节组成,前面四个字节表示这个box 的大小(包含这个头的8字节&a…...
我在工作一年时怎么都看不懂的编程写法。今天手把手教给你
作为一名程序员,你一定遇到或亲自写过这样的代码。有人将它形象的形容为shi山,或者被戏称为“面向保就业编程”。 以下面这个代码为例,其中的问题也显而易见,当越来越多的条件判断时,代码会变得非常臃肿,难…...
ThinkPHP5多小区物业管理系统源码(支持多小区)
基于 ThinkPHP5 Bootstrap 倾力打造的多小区物业 管理系统源码,操作简单,功能完善,用户体验良好 开发环境PHP7mysql 安装步骤: 1.新建数据库db_estate,还原数据db_estate.sql 2.修改配置文件:application/database.php 3.运…...
2024 年 API 安全:预测和趋势
随着技术以前所未有的速度不断进步,API(应用程序编程接口)安全性的复杂性也随之增加。随着 API 在现代应用程序和服务中的激增,组织将需要更好地了解其 API 环境以及 API 给运营带来的风险。 到 2024 年,预计几个关键…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
