对APK进行签名,正常情况下使用Gradle进行签名或者第三方开源签名工具或插件进行签名及ADB命名,这样需要给测试或运维人员进行讲解,解释半天他们会问你有批量工具吗?那作为程序员得你,只能说有。那我给大家一个用python写的基于apksigner进行批量签名的脚本,双击就OK了。

1. V1&V2签名

在给大家放出大招之前,先卖个萌,来一起了解一下Android的签名。在Android 7.0以下版本,一直使用的是Oracle提供的V1 scheme (JAR signing)签名方案。自从9行代码引发的88亿$官司之后,Google逐渐想法摆脱对Java的依赖。于是乎也就有了V2签名,从Android 7.0开始, 谷歌增加新签名方案 V2 Scheme (APK Signature),更安全的签名方式。
为了兼容之前的签名,默认是先进行了V1签名,然后再使用V2对其进行签名。
在 Android 7.0 以后,可以根据 APK 签名方案 v2(v2 方案)或 JAR 签名(v1 方案)验证 APK。更低版本的平台会忽略 v2 签名,仅验证 v1 签名。

1.1 V1签名

来自JDK(jarsigner), 是JDK提供的针对jar包签名的通用工具,位于JDK/bin/jarsigner.exe
对zip压缩包的每个文件进行验证, 签名后还能对压缩包修改(移动/重新压缩文件)
对V1签名的apk/jar解压,在META-INF存放签名文件(MANIFEST.MF, CERT.SF, CERT.RSA), 其中MANIFEST.MF文件保存所有文件的SHA1指纹(除了META-INF文件)
由此可知: V1签名是对压缩包中单个文件签名验证。

1.2 V2签名

来自Google(apksigner), 对zip压缩包的整个文件验证, 签名后不能修改压缩包(包括zipalign),对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效, 由此可知: V2签名是对整个APK签名验证。

为了保护 APK 内容,APK 包含以下 4 个部分:

  1. ZIP 条目的内容(从偏移量 0 处开始一直到“APK 签名分块”的起始位置)
  2. APK 签名分块
  3. ZIP 中央目录
  4. ZIP 中央目录结尾

APK 签名方案 v2 负责保护第 1、3、4 部分的完整性,以及第 2 部分包含的“APK 签名方案 v2 分块”中的 signed data 分块的完整性。

第 1、3 和 4 部分的完整性通过其内容的一个或多个摘要来保护,这些摘要存储在 signed data 分块中,而这些分块则通过一个或多个签名来保护。

第 1、3 和 4 部分的摘要采用以下计算方式,类似于两级 Merkle 树。 每个部分都会被拆分成多个大小为 1 MB(220 个字节)的连续块。每个部分的最后一个块可能会短一些。每个块的摘要均通过字节 0xa5 的连接、块的长度(采用小端字节序的 uint32 值,以字节数计)和块的内容进行计算。顶级摘要通过字节 0x5a 的连接、块数(采用小端字节序的 uint32 值)以及块的摘要的连接(按照块在 APK 中显示的顺序)进行计算。摘要以分块方式计算,以便通过并行处理来加快计算速度。

由于第 4 部分(ZIP 中央目录结尾)包含“ZIP 中央目录”的偏移量,因此该部分的保护比较复杂。当“APK 签名分块”的大小发生变化(例如,添加了新签名)时,偏移量也会随之改变。因此,在通过“ZIP 中央目录结尾”计算摘要时,必须将包含“ZIP 中央目录”偏移量的字段视为包含“APK 签名分块”的偏移量。
V2签名优点很明显:
1). 签名更安全(不能修改压缩包)
2). 签名验证时间更短(不需要解压验证),因而安装速度加快

2. apksigner

在 Android 7.0 Nougat 中引入了全新的 APK Signature Scheme v2签名方式。如果要对已经打包好的apk进行v2签名,这时我们就必须借助Android SDK提供的apksigner工具。
这个工具位于SDK目录的build-tools目录下。必须说明的是,v2签名方式时在Android7.0后才推出的,所以只有版本>25的SDK\build-tools\中才能找到apksigner.jar。

上面lib目录里面有apksigner.jar,这里路径最好配置到环境变量里。

apksigner对apk签名的各个参数

apksigner sign                 //执行签名操作
--ks 你的jks路径               //jks签名证书路径
--ks-key-alias 你的alias          //生成jks时指定的alias
--ks-pass pass:你的密码           //KeyStore密码
--key-pass pass:你的密码          //签署者的密码,即生成jks时指定alias对应的密码
--out output.apk               //输出路径
input.apk                   //需要签名的APK

apksigner sign –ks aoaoyi.jks –ks-key-alias aoaoyi –ks-pass pass:aoaoyi.com –key-pass pass:aoaoyi.com –out output.apk input.apk签名示例:

apksigner检查apk是否已经签名:

apksigner verify -v --print-certs xxx.apk
参数:-v, --verbose 显示详情(显示是否使用V1和V2签名)
--print-certs 显示签名证书信息例如:
apksigner verify -v aoaoyi.apkVerifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1

3. 批量签名

有上面大家已经对Android签名有了大致了解,由于V1逐渐被遗忘,我也没有细说,如果想知道V1签名的使用方法请看apk反编译及重新打包,里面有介绍。
接下来真是切入主题->使用Python、apksigner实现对APK进行批量签名。

3.1 我们先来看MultiSigner.py代码

#!/usr/bin/python
#coding:UTF-8
import shutil
import os
"""
1.安装Python27,配置环境变量。
2.配置apksinger的环境变量。
3.把xxx.jks、xxx.apk(支持多个)放入和MultiSigner.py同目录下。
4.双击MultiSigner.py,出现命令行窗体,等待。
5.按任意键结束。
6.查看output目录下已签好的apk文件。
"""
#jks签名证书(放在当前目录中)
jksFile = 'aoaoyi.jks'
#KeyStore密码
storePassword = 'aoaoyi.com'
#生成jks时指定的alias
keyAlias = 'aoaoyi'
#签署者的密码,即生成jks时指定alias对应的密码
keyPassword = 'aoaoyi.com@gmail'# 获取当前目录中所有的apk源包
src_apks = []
# python3 : os.listdir()即可,这里使用兼容Python2的os.listdir('.')
for file in os.listdir('.'):if os.path.isfile(file):extension = os.path.splitext(file)[1][1:]if extension in 'apk':src_apks.append(file)
try:for src_apk in src_apks:# file name (with extension)src_apk_file_name = os.path.basename(src_apk)# 分割文件名与后缀temp_list = os.path.splitext(src_apk_file_name)# name without extensionsrc_apk_name = temp_list[0]# 后缀名,包含.   例如: ".apk "src_apk_extension = temp_list[1]# 创建生成目录output_dir = 'output/'# 目录不存在则创建if not os.path.exists(output_dir):os.mkdir(output_dir)#目标文件路径target_apk = output_dir + src_apk_name + src_apk_extension#签名后的文件路径signer_apk = output_dir + src_apk_name + '_signer' + src_apk_extension#拼装签名命令signer_str = 'cmd.exe /k apksigner sign --ks ' + jksFile + ' --ks-pass pass:' + storePassword + ' --ks-key-alias ' + keyAlias + ' --key-pass pass:' + keyPassword + ' --out ' + signer_apk + ' ' + src_apk#执行签名命令signer_result = os.popen(signer_str)#输出签名命令执行结果if(signer_result.read() != ''):print 'signer_result:\t', 'success'else:print 'signer_result:\t', 'fail'#拼装验证签名命令verify_str = 'apksigner verify -v --print-certs ' + signer_apk#执行对签过的apk进行签名验证verify_result = os.popen(verify_str)#输出验证签名命令执行结果print 'verify_result:\t', verify_result.read()#os.remove(target_apk)
except Exception, e:print 'Exception:\t', repr(e)
print '请输入任意键退出'.decode('UTF-8').encode('GBK')
#等待输入
raw_input()

3.2. 目录文件

3.2. 运行后,命令展示信息

你把这个脚本甩给测试或运维,你就再也不受他们打扰了。如果考虑到安全的话,你在代码服务器上构建个GO界面直接调用这个脚本,把生成的apk包生成一个下载地址供下载就可以了。这样就节约了自己很多时间。

参考:
https://source.android.com/security/apksigning/v2#v1-verification
https://developer.android.com/studio/command-line/apksigner
ADB的常用命令
apk反编译及重新打包

用apksigner进行批量签名的脚本相关推荐

  1. 批量安装zabbix-agent脚本

    批量安装zabbix-agent脚本,为了方便识别名称,自动根据IP最后一位对主机进行重命名操作,方便zabbix-server开启批量注册时,名称识别时用.也避免zabbix-server老是30分 ...

  2. 为什么脚本执行一行就不动了_Centos7 批量创建用户账号脚本

    前言: 学习或生产工作中,你可能遇到批量创建 Centos 用户的情况,一段shell 脚本来帮助你: 如何做: 0,我们把脚本保存为 ac.sh: 1,提前建立一个 accountadd.txt 的 ...

  3. shp2sde命令行方式向arcsde批量导入数据脚本的生成步骤

    shp2sde命令行方式向arcsde批量导入数据脚本的生成步骤  作者:半块点心  出处:GIS动力站原 1.在dos提示符下执行: FOR /F "eol=; tokens=1,2,3, ...

  4. MySQL 批量生成 SQL 脚本语句解决实际的业务需求/如何拼接字符串/拼接字符串的 SQL 语句

    文章目录 实际需求 分析思路 写拼接 SQL 脚本的脚本语句 执行得到脚本语句 保存成 SQL 脚本文件 实际需求 有些行政区域的字段 area_fullname 是空的,如何补全呢?如下所示: 分析 ...

  5. oracle 并行执行脚本,批量执行Oracle脚本

    场景:linux上批量执行oracle脚本的shell脚本 linux下批量执行oracle脚本的shell脚本 #! /bin/bash -l create_dbtable() { set -x d ...

  6. 程序.NET Framework版本升级,重签名,重链接,批量签名工具

    /Files/dahuaidan410/UpdateCoreeVer.rar 1,当我们将项目从.NET 1.0迁移到.NET 2.0甚至到.NET 4.0我们有一些第三方的组件由于没有源码而不能迁移 ...

  7. php 批量删除挂马文件夹,PHP批量挂马脚本

    批量写入档案脚本... 可以拿来挂马 也能拿来当RFI的后门注入 code都写明的,有需要的请自己看 后门写在$inj里面,要做base64 encode的Polymorphic 不希望这个东西被搞破 ...

  8. 微步在线云API-python批量检测IP脚本

    微步在线云API-python批量检测IP脚本 IP 信誉 针对入站场景的IP进行分析, 能够提供IP的地理位置.ASN信息,通过判定规则精准判别IP是否恶意.风险严重级别.可信度级别:识别威胁类型, ...

  9. android 自动签名工具下载,安卓批量签名工具使用说明

    安卓批量签名工具使用Python编写,利用此工具对未签名apk实现修改AndroidManifest.xml的多个meta-data信息,并自动签名(可实现多个签名) 如果只需要进行多渠道打包,可参考 ...

最新文章

  1. 物理机存放mysql实例原则_MySQL数据库规范 (设计规范+开发规范+操作规范)
  2. jenkins访问页面是那个html,Jenkins自动化代码上线-静态网页篇
  3. 别忘了在使用MES系统之前,还有关键一步!
  4. 增加SYSTE表空间数据文件
  5. C语言求阶乘(附完整源码)
  6. GIT_服务器与本地环境构建
  7. 安装VMware时提示无效驱动器:D:\的解决办法
  8. js实现日期农历与公历的互转
  9. 试用bus hound来分析STM32CubeMX来生成USB_HID_Mouse工程
  10. Linux服务管理之unit的概念
  11. php mailer altbody,PHP_phpmailer 中文使用说明(简易版),phpmailer v5.1下载 A开头: $AltBody - phpStudy...
  12. 【文智背后的奥秘】系列篇——文本聚类系统
  13. 噪声特性及matlab函数
  14. 模式窗口window.showModalDialog()的用法
  15. 根据需求,完成如下代码(按照标准格式写),并在测试类中进行测试?
  16. 有什么免费的视频格式转换工具推荐?
  17. mysql存储过程default的意思,针对新手的MYSQL存储过程详解
  18. html中如何实现a标签的点击事件
  19. 容器技术之容器引擎与江湖门派
  20. Android Studio 安装详解及安装过程中出现的问题解决方案

热门文章

  1. spring boot的hello world小实验
  2. 7.4.7 2DPCA
  3. 解决Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), ple..
  4. 启动Eclipse时,启不起来JVM terminated. Exit code=-1
  5. MZOJ 1134: 二叉苹果树
  6. vue 通过绑定事件获取当前行的id
  7. 感觉要火!妹子实地采访网易猪厂程序员七夕怎么过
  8. 韩研究人员声称:创造出了一块“不可破坏”的芯片!
  9. python-websocket-server hacking
  10. 【HDOJ】3948 The Number of Palindromes