APK签名是如何生成的
零、前言
本文以支付宝手机客户端为例,进行剖析
到支付宝官网下载当前最新版本:8.0.1 (2014-01-28)
文件名为 alipay_wap_main.apk
MD5 摘要为 69820edb3cd13b49ef4e1fb3175ec453
将后缀改为.zip,直接解压,可以看到目录 META-INF,其中包含三个文件 MANIFEST.MF、CERT.SF、CERT.RSA
下面就是这三个文件的生成过程
一、文件 MANIFEST.MF
首先列出签名前 APK 中的文件清单,脚本内容如下
use Cwd;
use File::Find; $pwd = getcwd();
sub printFilename{
if ( (! -d $File::Find::name) && ($File::Find::name =~ /$pwd/) ){
print qq/$\n/ if($File::Find::name =~ /$pwd\/(.*)/)
}
};
find(\&printFilename, $pwd);
运行上面脚本,利用得到的文件清单构造以下内容(见星号包围部分,Name 所在行是清单中的文件名称)
*****************************************************
Manifest-Version: 1.0
Created-By: 1.0 (Android)
Name: res/drawable/credit_main_list_selector.xml
SHA1-Digest: BQFbkZbuQuxWLBuQIsQJCccH26c=
Name: res/drawable-hdpi/kakalib_poweredby.png
SHA1-Digest: Zd5BTNYWcJ3rs2xDsk1LnWeNl9c=
……
*****************************************************
上面的 Name/SHA1-Digest 对中,SHA1-Digest 后跟的内容是由 Name 对应文件先 SHA-1、再 BASE64 运算后得到
以文件 res/drawable/credit_main_list_selector.xml 为例,验证如下
openssl dgst -binary -sha1 credit_main_list_selector.xml > credit_main_list_selector.xml.sha1
openssl base64 -in credit_main_list_selector.xml.sha1
BQFbkZbuQuxWLBuQIsQJCccH26c=
按此规则反复计算每一文件的 SHA1-Digest 值,最后得到 MANIFEST.MF 文件
二、按如下格式构造文件 CERT.SF
*****************************************************
Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA1-Digest-Manifest: 6z2GEaKqXuWgJi1BkX4iWfnRJaM=
Name: res/drawable/credit_main_list_selector.xml
SHA1-Digest: pL/8COLxHW1z8q8vyeMatFKBuyw=
Name: res/drawable-hdpi/kakalib_poweredby.png
SHA1-Digest: SeuGMeYM2Sqin7lzVAFGlhdpaGY=
……
*****************************************************
其中,SHA1-Digest-Manifest 后面的红色文字部分是 MANIFEST.MF 文件先 SHA-1、再 BASE64 处理后的结果
openssl dgst -binary -sha1 MANIFEST.MF > MANIFEST.MF.sha1
openssl base64 -in MANIFEST.MF.sha1
6z2GEaKqXuWgJi1BkX4iWfnRJaM=
SHA1-Digest 后跟的内容是由 MANIFEST.MF 文件中对应的部分 先SHA-1、再 BASE64 处理后的结果
以文件 res/drawable/credit_main_list_selector.xml 为例,该文件在 MANIFEST.MF 中对应的部分为
*****************************************************
Name: res/drawable/credit_main_list_selector.xml
SHA1-Digest: BQFbkZbuQuxWLBuQIsQJCccH26c=
*****************************************************
注意,最后有两个回车换行,将星号包围的内容保存成文件 credit_main_list_selector.manifest
od -An -tx1z credit_main_list_selector.manifest
4e 61 6d 65 3a 20 72 65 73 2f 64 72 61 77 61 62 >Name: res/drawab<
6c 65 2f 63 72 65 64 69 74 5f 6d 61 69 6e 5f 6c >le/credit_main_l<
69 73 74 5f 73 65 6c 65 63 74 6f 72 2e 78 6d 6c >ist_selector.xml<
0d 0a 53 48 41 31 2d 44 69 67 65 73 74 3a 20 42 >..SHA1-Digest: B<
51 46 62 6b 5a 62 75 51 75 78 57 4c 42 75 51 49 >QFbkZbuQuxWLBuQI<
73 51 4a 43 63 63 48 32 36 63 3d 0d 0a 0d 0a >sQJCccH26c=....<
openssl dgst -binary -sha1 credit_main_list_selector.manifest > credit_main_list_selector.manifest.sha1
openssl base64 -in credit_main_list_selector.manifest.sha1
pL/8COLxHW1z8q8vyeMatFKBuyw=
三、生成 CERT.SF 文件的签名,将签名结果及对应证书,以 PKCS #7 格式保存到 CERT.RSA 文件
PKCS #7 标准参见 RFC 2315,此处不再详述,而仅关注其中相关的签名及证书内容
openssl asn1parse -in CERT.RSA -inform DER -i -dump
输出的最后部分就是签名数据,如下
791:d=5 hl=3 l= 128 prim: OCTET STRING
0000 - 5b 3c f1 f7 7a 5f 3f c8-9e 1b e3 80 09 c8 b3 8a [<..z_?.........
0010 - 47 a7 11 04 c8 91 0f 4c-b9 a2 25 9c 4b f1 9a a3 G......L..%.K...
0020 - 6c c1 1b 2a 84 b5 06 bc-82 90 73 da 7c 1d 97 e5 l..*......s.|...
0030 - 15 63 64 71 27 31 b7 b0-33 50 90 82 51 e9 23 65 .cdq'1..3P..Q.#e
0040 - 5c de f7 3d 29 12 14 f4-27 88 de fc c1 b0 a0 61 \..=)...'......a
0050 - 87 0d c7 a5 7c 5b 4c 7a-04 4f 25 29 35 8e 5b 42 ....|[Lz.O%)5.[B
0060 - 08 bf 1e 64 cb a2 69 16-35 b0 5d f1 32 2e c3 1a ...d..i.5.].2...
0070 - f8 cd 4b d3 29 1f 82 2a-9f 66 ea 4d b4 86 9f 69 ..K.)..*.f.M...i
CERT.RSA 文件中的证书内容可以用命令 openssl pkcs7 -in CERT.RSA -inform der -print_certs -text 查看
下面是显示的部分信息
Issuer: C=cn, ST=beijing, L=beijing, O=alipay, OU=alipay, CN=shiqun.shi
Subject: C=cn, ST=beijing, L=beijing, O=alipay, OU=alipay, CN=shiqun.shi
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:b6:cb:ad:6c:bd:5e:d0:d2:09:af:c6:9a:d3:b7:
a6:17:ef:aa:e9:b3:c4:7e:ab:e0:be:42:d9:24:93:
6f:a7:8c:80:01:b1:fd:74:b0:79:e5:ff:96:90:06:
1d:ac:fa:47:68:e9:81:a5:26:b9:ca:77:15:6c:a3:
62:51:cf:2f:90:6d:10:54:81:37:49:98:a7:e6:e6:
e1:8f:75:ca:98:b8:ed:2e:af:86:ff:40:2c:87:4c:
ca:0a:26:30:53:f2:22:37:85:82:06:86:7d:21:00:
20:da:a3:8c:48:b2:0c:c9:df:d8:2b:44:a5:1a:eb:
5d:b4:59:b2:27:94:e2:d6:49
Exponent: 65537 (0x10001)
这张自签名证书的主体名称(C=cn,ST=beijing,L=beijing,O=alipay,OU=alipay,CN=shiqun.shi)为员工名字,稍显不正规:)
最后,验证下签名的正确性,依旧祭出 perl 这个工具,计算如下
perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x5b3cf1f77a5f3fc89e1be38009c8b38a47a71104c8910f4cb9a2259c4bf19aa36cc11b2a84b506bc
829073da7c1d97e5156364712731b7b03350908251e923655cdef73d291214f42788defcc1b0a061870dc7a57c5b4c7a044f2529358e5b4208bf1e64cba269
1635b05df1322ec31af8cd4bd3291f822a9f66ea4db4869f69, 0x010001, 0xb6cbad6cbd5ed0d209afc69ad3b7a617efaae9b3c47eabe0be42d924936fa7
8c8001b1fd74b079e5ff9690061dacfa4768e981a526b9ca77156ca36251cf2f906d105481374998a7e6e6e18f75ca98b8ed2eaf86ff402c874cca0a263053
f22237858206867d210020daa38c48b20cc9dfd82b44a51aeb5db459b22794e2d649);print $x->as_hex"
输出结果为
0x0001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
003021300906052b0e03021a050004144677182bf20ad64f509dc7b519f7294c19075cc7
签名格式遵循的是 PKCS #1 标准,签名内容是 CERT.SF 文件,如下
openssl dgst -sha1 CERT.SF
SHA1(CERT.SF)= 4677182bf20ad64f509dc7b519f7294c19075cc7
验证成功
四、总流程图
APK签名是如何生成的的更多相关文章
- eclipse将android项目生成apk并且给apk签名
转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...
- (转)在eclipse中将android项目生成apk并且给apk签名
转:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作目 ...
- 关于APK签名的一些东西
什么是APK 了解APK签名之前,首先要知道什么是apk文件:APK是AndroidPackage的缩写,即Android安装包(apk),APK文件其实就是zip格式的文件,只是后缀被改为了apk, ...
- Android APK 签名 (转发)
Cordova 3.5 为 Android APK 签名,生成可发布的 APK 程序文件 任侠 2014-06-07 00:04 移动开发 抢沙发 16,288 views 目录 [隐藏] ...
- apk签名(不打包)
apk提交给应用市场加固后,需要重新签名 签名工具:360签名 下载地址:http://yunpan.cn/cm8GqVWL7Y8Eh 签名步骤:http://jiagu.360.cn/qcms/he ...
- 为App签名(为apk签名)
为App签名(为apk签名) 原文地址 这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商 ...
- Android开发中Ant命令编译和APK签名的一些心得
本文章麦子学院跟小伙伴们详细的分享一下关于Android Ant命令行编译和APK签名详解一些实现方法,这是一个朋友在自己做安卓开发时写的,希望对大家会有所帮助呀. 最近在做Android开发时,需要 ...
- Android学习系列(1)--为App签名(为apk签名)
写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,博客园就是这样的舞台.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签 ...
- apk签名《转》
出处!:http://jeff-pluto-1874.iteye.com/blog/847366 我觉得写的不错就转载了. 一.Android Apk签名Apk签名首先要有一个keystore的签名用 ...
随机推荐
- ubuntu16.04安装virtualbox5.1失败 gcc:error:unrecognized command line option ‘-fstack-protector-strong’
系统:ubuntu16.04.1 软件:Virtualbox-5.1 编译器:GCC 4.7.4 在如上环境下安装Vbx5.1提示我在终端执行/sbin/vboxconfig命令 照做 出现如下err ...
- UIautomator Python测试
#!/usr/bin/env python # -*- coding: utf-8 -*- import unittest from mock import MagicMock, patch impo ...
- Sprint1(第二天11.15)
Sprint1(第二天11.15) Sprint1第一阶段 1.类名:软件工程-第一阶段 2.时间:11.14-11.23 3.选题内容:web版-餐厅到店点餐系统 4.团队博客地址: http:// ...
- O2O、C2C、B2B、B2C的区别
一.O2O.C2C.B2B.B2C的区别在哪里? o2o 是 online to offline 分为四种运营模式 1.online to offline 是线上交易到线下消费体验 2.offline ...
- 结构struct
1.结构变量 1)定义结构类型 struct student { char *name; int age; int score[3]; }; 2)定义结构变量 struct student stu1, ...
- php curl用法
curl 是使用URL语法的传送文件工具,支持FTP.FTPS.HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP.curl 支持SSL证书.HTTP POS ...
- 如何使用Notepad++编译运行php
安装编译运行文件的插件.插件-Plugin Manager-Show Plugin Manager. 找到NppExec插件,从这个插件的名字来看就是各位文件的执行.点击Install.需要下载安装, ...
- spark发行版笔记9
感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制. 本期概览: 1 Receiver生命全周期 首先,我们找到数据来源的入口,入口如下 Receiver的设计是极其巧妙 ...
- 山锅(samgor)的博客 2014
搞移动端的前端开发已经3年,悄悄地从一个前端小白变成老油条. 项目已经做了好几个,最近发现技术的提升貌似停滞不前.说很菜吧,知道的还是不少.说精通吧,自我感觉还算不上. 认真的考虑下这个问题,觉得技术 ...
- 2014中国黑客榜(beta版)
黑客,英文hacker.精通计算机各类技术的计算机高手,泛指擅长IT技术的人群.计算机科学家. 最近受某机构所托搜集国内活跃黑客近况.本着客观专业,权威可信的原则参考了国内从00年到最新的黑客榜单,以 ...