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

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支持的就行,这里列举一些签名的例子:

  1. 只用keystore文件kyunban.jks中的私钥进行签名:
// 如果不通过--out指定新的文件名,签名的文件也就是app.apk,覆盖掉原先未签名的文件
$ apksigner sign --ks kyunban.jks app.apk
  1. 只用keystore文件kyunban.jks中的私钥进行签名,签名的文件不覆盖原来未签名的文件
$ apksigner sign --ks kyunban.jks --in app.apk --out app-signed.apk
  1. 通过.pk8文件中的私钥和证书文件中的证书链一起签名,注意这里要求证书文件格式必须是X.509 PEM 或 DER 格式:
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
  1. 用两个私钥对apk文件进行签名
$ apksigner sign --ks release.jks --next-signer --ks magic.jks app.apk
  1. 如果签名时,.jks用的密码字符不是ASCII编码,那么需要通过--pass-encoding指定密码的字符集,这样就可以使用非ASCII编码的密码了。
$ apksigner sign --ks release.jks --pass-encoding ibm437 app.apk
  1. 使用 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
  1. 用轮换签名证书签名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 年,预计几个关键…...

常见的 17 种 RAG 方案解析

近年来,随着大语言模型(LLM)的广泛应用,检索增强生成(Retrieval-Augmented Generation,RAG)系统逐渐成为连接私有知识库与智能问答的核心架构。RAG 不仅弥补了大模型在实时性与事实性上的不足&a…...

PCB高级工艺如何降本:盲孔、微孔与HDI设计的成本优化实战

1. 项目概述:当高级PCB技术成为降本利器在硬件研发圈子里待久了,总有一个根深蒂固的印象:但凡沾上“高级”、“高密度”这些词的技术,比如盲孔、埋孔和微孔,那成本肯定是蹭蹭往上涨。我刚开始接触HDI板设计时也是这么想…...

解决 Claude Code 频繁封号问题之转向 Taotoken 稳定服务

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决 Claude Code 频繁封号问题之转向 Taotoken 稳定服务 对于依赖 Claude Code 进行开发的工程师而言,账号访问权限的…...

工业DC-DC电源模块性能选型解析|钡特电源 VB15-48S24MD 与 URB4824YMD-15WR3 封装互通

在工业控制、通信设备、仪器仪表等领域,工业 DC-DC 模块电源作为核心供电单元,其稳定性、兼容性与性价比直接影响系统整体可靠性。随着国产化进程加速,国产工业电源模块在技术、品质上已达到国际先进水平,成为硬件工程师选型的重要…...

地铁站内人员危险情况检测人员跌倒检测数据集VOC+YOLO格式4369张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4369 标注数量(xml文件个数):4369 标注数量(txt文件个数):4369 …...

UE4SS终极指南:5步掌握虚幻引擎游戏修改与脚本开发

UE4SS终极指南:5步掌握虚幻引擎游戏修改与脚本开发 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4SS …...

PHPStudy本地开发,用上Redis 5的Stream和HyperLogLog到底有多香?

PHPStudy本地开发中Redis 5的Stream与HyperLogLog实战指南 Redis作为高性能的内存数据库,在PHP开发中扮演着重要角色。当我们在本地开发环境使用PHPStudy时,默认安装的Redis 3.0.504版本功能有限,无法体验Redis 5引入的强大新特性。本文将深…...

从Claude Code到nanocode:轻量级AI编程助手核心架构与工程实践

1. 项目概述:从Claude Code到nanocode的轻量化之路 如果你是一名开发者,尤其是对AI编程助手(AI Agent)的内部工作原理充满好奇,那么你很可能听说过Anthropic的Claude Code。它是一个功能强大的命令行AI代理&#xff0…...

Linux下Cursor AI编辑器自动化安装脚本设计与实现

1. 项目概述:为什么我们需要一个Cursor的Linux安装脚本如果你是一个在Linux环境下工作的开发者,并且对AI辅助编程工具感兴趣,那么Cursor这个名字你一定不陌生。作为一款集成了强大AI能力的代码编辑器,它正迅速成为许多程序员的新宠…...

Instill Core:一站式AI应用构建平台,从数据处理到模型部署全流程实战

1. 项目概述:一站式AI应用构建平台如果你正在为如何将一堆杂乱无章的文档、图片、音频视频数据,转化为可供AI模型直接“食用”的格式而头疼,或者厌倦了在模型部署、API编排和数据处理工具之间反复横跳,那么Instill Core的出现&…...