Android APK 签名文件MANIFEST.MF、CERT.SF、CERT.RSA分析
首先我们找一个已经签名的apk文件,修改后缀名为zip,然后解压。可以看到里面有一个META-INF文件夹,里面就是签名验证的文件。有三个文件MANIFEST.MF、CERT.SF、CERT.RSA分别保存着不同的签名信息,下面一个一个来分析:
首先是MANIFEST.MF文件,打开MANIFEST.MF文件如下:
Manifest-Version: 1.0
Created-By: 1.0 (Android)
Name: res/layout/main.xml
SHA1-Digest: TKJzyMwELyakLZYM83o10LERyPQ=
Name: AndroidManifest.xml
SHA1-Digest: vf51A+/qPTUhmRyQmU6GS83eO9Y=
Name: res/drawable/keys.png
SHA1-Digest: 3nPhCCVKGHdAha70YYcNvESbv5g=
Name: resources.arsc
SHA1-Digest: uh4vliR9xNyjDpU3d+WmfzTIumE=
Name: classes.dex
SHA1-Digest: S83QHv3CvsRo3e4gWNpZpvifWzg=
可以看到每一个对应的文件下面都有一个SHA1-Digest的值。这个值为该文件SHA-1值进行base64编码后的结果。
来验证一下:
首先获取文件的SHA-1值如下为:4CA273C8CC042F26A42D960CF37A35D0B111C8F4
复制该值到winhex中,如下:
另存为文件sha1,然后使用base64工具对该文件进行base64编码:
查看base64文件的内容为:TKJzyMwELyakLZYM83o10LERyPQ=
和上面值完全吻合。
还可以通过查看源码进行验证:http://androidxref.com/4.4_r1/xref/build/tools/signapk/SignApk.java
也可以看出MANIFEST.MF中保存了所有其他文件的SHA-1并base64编码后的值。
MANIFEST.MF文件分析完了,我们继续来分析CERT.SF这个文件,查看文件内容如下:
Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA1-Digest-Manifest: Uin+pH/oQLOt1Esnw9TTJpf8URc=
Name: res/layout/main.xml
SHA1-Digest: +zm+W/d5nXnQRHhQq1BeXsj4sWU=
Name: res/drawable/keys.png
SHA1-Digest: 9CMNr6u3Zg/XymrpDC4NH/Qb+GE=
Name: AndroidManifest.xml
SHA1-Digest: q4qz8AP4LsfMh0TWEgTcSif6eqg=
Name: resources.arsc
SHA1-Digest: U1T+Km9u0pHDYncmJTz+Fae35iU=
Name: classes.dex
SHA1-Digest: iOqu/znF0ISqd6UtTmA4d5isoQs=
从上面可以看到多了一项SHA1-Digest-Manifest的值,这个值就是MANIFEST.MF文件的SHA-1并base64编码后的值。
源码中也可以看出:
而后面几项的值是对MANIFEST.MF文件中的每项再次SHA1并base64编码后的值。
把MANIFEST.MF文件的第一项拿出来,加两个\r\n:
Name: res/layout/main.xml
SHA1-Digest: +zm+W/d5nXnQRHhQq1BeXsj4sWU=
保存为文件,查看文件的SHA1值为:FB39BE5BF7799D79D0447850AB505E5EC8F8B165
复制到windex,然后使用base64进行编码,结果为:+zm+W/d5nXnQRHhQq1BeXsj4sWU=
也就是上面CERT.SF文件中的第一项(SHA-1 + Base64)(MANIFEST.MF文件及各子项) == CERT.SF中各值)。
###############################################################
最后一个文件CERT.RSA包含了公钥信息和发布机构信息。
首先我们使用自己的公钥对apk进行签名然后再来查看该文件的信息。
下载openssl:http://openssl-for-windows.googlecode.com/files/openssl-0.9.8k_WIN32.zip
解压进入bin目录,执行:
openssl genrsa -3 -out testkey.pem 2048
成功生成:testkey.pem
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000
如有错误:Unable to load config info from c:/openssl/ssl/openssl.cnf,把文件复制到这个目录即可。
最后得到新签名的new.apk文件,找到里面的CERT.RSA文件,使用下面的程序得到里面的信息:
package getCerFromCERTRSA;
import java.io.FileInputStream;
import java.security.cert.X509Certificate;
import sun.security.pkcs.PKCS7;
public class Test {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream(“F:\\CERT.RSA”);
PKCS7 pkcs7 = new PKCS7(fis);
X509Certificate publicKey = pkcs7.getCertificates()[0];
System.out.println(“issuer1:” + publicKey.getIssuerDN());
System.out.println(“subject2:” + publicKey.getSubjectDN());
System.out.println(publicKey.getPublicKey());
}
}
输出结果如下:
issuer1:EMAILADDRESS=AloneMonkey@163.com, CN=AloneMonkey, OU=Coder, O=Coder, L=changsha, ST=hunan, C=cn
subject2:EMAILADDRESS=AloneMonkey@163.com, CN=AloneMonkey, OU=Coder, O=Coder, L=changsha, ST=hunan, C=cn
Sun RSA public key, 2048 bits
modulus: 27930608814223381116057921387749214219559488459834487651049472010943787998241917988099072185267085555323069515811092018497891216669481600034343393035843203267770583265755751519703070241992378137769943338514083146152811868483298881047691082051273026613334389423463323096799738980315739301150294781233689740925257750884810644704745529309986744250843593240651888438182488344317720617399108875832748401930758903852667930580643990438517537220738513412902358548274823884382164690517621920930706694824579819829817712366306758824210255361732602763101633753447049235308644785379979711318126409377911209205177369163520192093063
public exponent: 3
就是刚刚我们输入的信息。
PS:如果代码出现找不到sun.security.pkcs.PKCS7时,解决方法是:右键工程属性。
然后点击Add:
总结:不同的程序公钥不同。
签名校验:
1.程序自校验,可以把原本的公钥信息(或者.RSA文件)存放到某一文件处,运行时计算当前的公钥信息(或者.RSA文件)与存放的信息是否一致。
2.联网校验,运行时的公钥信息和服务器端存储的公钥信息进行比对。
本文链接:http://www.blogfshare.com/android-apk-sign.html
Android APK 签名文件MANIFEST.MF、CERT.SF、CERT.RSA分析相关推荐
- Android基础:签名文件MANIFEST.MF的内容是怎么计算来的?
文章来源 作者:九九叔 链接:https://www.jianshu.com/p/93616b1ebe86 来源:简书 了解下Android的签名机制,MANIFEST.MF是签名文件一个重要的组成. ...
- 【JAVA】MANIFEST.MF / CERT.SF 中 文件SHA1-Digest计算方法
前言: 给旧手机刷机,rom.zip 直接解压魔改,完后再压缩为zip刷入手机.其间遇到了 MANIFEST.MF / CERT.SF 这两个文件,看看是怎么回事吧. MANIFEST.MF Mani ...
- Android APK的签名--笔记版 V1 签名和V2签名总结
1. 工具介绍 jarsigner 是JDK提供的针对jar包签名的通用工具, 位于 JDK/bin/jarsigner apksigner 是Google官方提供的针对Android apk 签名验 ...
- Android APK签名总结-- V1签名和V2签名使用和区别
1. 工具介绍 jarsigner 是JDK提供的针对jar包签名的通用工具, 位于 JDK/bin/jarsignerapksigner 是Google官方提供的针对Android apk 签名验证 ...
- Android APK文件结构 完整打包编译的流程 APK安装过程 详解
Android apk文件结构 打包编译的流程 Android官网 配置构建 流程 Configure your build The build process APK文件结构 assets res ...
- android apk 的信息,Android中获取apk基本信息
一 PackageManager可以获得的所有包节点信息: 1,所有节点的基类:PackageItemInfo: 2,PackageInfo:package的全面信息,与AndroidManifest ...
- Android apk反编译学习【天天酷跑】
微信游戏出来之后,网上出现很多破解教程和攻略,修改最多的有无敌打飞机,无限弹药,刷分数,天天酷跑刷金币等.看了下破解方法不外乎以下两种: 1.反编译游戏apk包,修改smali字节码,重新打包. 2. ...
- Android APK 签名、打包笔记
我们知道,一款Android 要发布的话,必须经过签名,Android目前支持的签名方式包括三种: v1 方案:基于JAR签名. v2 方案:APK 签名方案 v2(在 Android 7.0 中引入 ...
- android APK签名过程之CERT.SF分析
MANIFEST.MF文件内容: Manifest-Version: 1.0 Created-By: 1.0 (Android)Name: res/drawable-xhdpi/ic_launcher ...
最新文章
- 2010.9.29 今日问题
- python并发之concurrent.futures
- 上证50ETF申赎清单
- C# .net web.config配置access连接字符串
- 建堆解决TopK问题
- MS SQL Server存储过程的优点有哪些呢?
- python决策树预测模型_「数据挖掘入门系列」数据挖掘模型之分类与预测 - 决策树...
- 设计、经验和变革:做好IT战略规划的三要素
- Python-pandas-Excel排序、筛选
- 边境的悍匪—机器学习实战:第六章 决策树
- 【 Codeforces Round #521 (Div. 3) E. Thematic Contests】二分+STL
- Apache Spark源码阅读环境搭建
- 热播剧《延禧攻略》进入台湾2019年学测语文试题
- 【爆品】馥兰朵想买找谁?代理能月入过万吗?
- PHPWord生成文档 表格,复制模板文档
- 2021电赛国一——K题照度稳定可调LED台灯
- Ubuntu 16.04 下 旋转显示器屏幕 竖屏显示
- 整数的上下取整和浮点数的上下取整 java
- 医院住院管理信息系统设计说明书+源码
- 独立钻石跳棋问题的C++实现
热门文章
- 让OpenCV2.4.9支持虚拟环境python3.5
- Python/word.so: undefined symbol: _ZNK4Word7reverseEv
- 深度学习(三十六)——R-FCN, FPN, RetinaNet, CornerNet
- 顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗?
- netty的Helloworld---netty学习笔记
- Java虚拟机内存区域---学习笔记
- Java整合Spring发送邮件
- Day45--js基本小结
- Winform开发框架之通用短信邮件通知模块
- Linux Shell 从入门到删除根目录跑路指南