首先我们找一个已经签名的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分析相关推荐

  1. Android基础:签名文件MANIFEST.MF的内容是怎么计算来的?

    文章来源 作者:九九叔 链接:https://www.jianshu.com/p/93616b1ebe86 来源:简书 了解下Android的签名机制,MANIFEST.MF是签名文件一个重要的组成. ...

  2. 【JAVA】MANIFEST.MF / CERT.SF 中 文件SHA1-Digest计算方法

    前言: 给旧手机刷机,rom.zip 直接解压魔改,完后再压缩为zip刷入手机.其间遇到了 MANIFEST.MF / CERT.SF 这两个文件,看看是怎么回事吧. MANIFEST.MF Mani ...

  3. Android APK的签名--笔记版 V1 签名和V2签名总结

    1. 工具介绍 jarsigner 是JDK提供的针对jar包签名的通用工具, 位于 JDK/bin/jarsigner apksigner 是Google官方提供的针对Android apk 签名验 ...

  4. Android APK签名总结-- V1签名和V2签名使用和区别

    1. 工具介绍 jarsigner 是JDK提供的针对jar包签名的通用工具, 位于 JDK/bin/jarsignerapksigner 是Google官方提供的针对Android apk 签名验证 ...

  5. Android APK文件结构 完整打包编译的流程 APK安装过程 详解

    Android apk文件结构 打包编译的流程 Android官网 配置构建 流程 Configure your build The build process APK文件结构 assets res ...

  6. android apk 的信息,Android中获取apk基本信息

    一 PackageManager可以获得的所有包节点信息: 1,所有节点的基类:PackageItemInfo: 2,PackageInfo:package的全面信息,与AndroidManifest ...

  7. Android apk反编译学习【天天酷跑】

    微信游戏出来之后,网上出现很多破解教程和攻略,修改最多的有无敌打飞机,无限弹药,刷分数,天天酷跑刷金币等.看了下破解方法不外乎以下两种: 1.反编译游戏apk包,修改smali字节码,重新打包. 2. ...

  8. Android APK 签名、打包笔记

    我们知道,一款Android 要发布的话,必须经过签名,Android目前支持的签名方式包括三种: v1 方案:基于JAR签名. v2 方案:APK 签名方案 v2(在 Android 7.0 中引入 ...

  9. android APK签名过程之CERT.SF分析

    MANIFEST.MF文件内容: Manifest-Version: 1.0 Created-By: 1.0 (Android)Name: res/drawable-xhdpi/ic_launcher ...

最新文章

  1. 2010.9.29 今日问题
  2. python并发之concurrent.futures
  3. 上证50ETF申赎清单
  4. C# .net web.config配置access连接字符串
  5. 建堆解决TopK问题
  6. MS SQL Server存储过程的优点有哪些呢?
  7. python决策树预测模型_「数据挖掘入门系列」数据挖掘模型之分类与预测 - 决策树...
  8. 设计、经验和变革:做好IT战略规划的三要素
  9. Python-pandas-Excel排序、筛选
  10. 边境的悍匪—机器学习实战:第六章 决策树
  11. 【 Codeforces Round #521 (Div. 3) E. Thematic Contests】二分+STL
  12. Apache Spark源码阅读环境搭建
  13. 热播剧《延禧攻略》进入台湾2019年学测语文试题
  14. 【爆品】馥兰朵想买找谁?代理能月入过万吗?
  15. PHPWord生成文档 表格,复制模板文档
  16. 2021电赛国一——K题照度稳定可调LED台灯
  17. Ubuntu 16.04 下 旋转显示器屏幕 竖屏显示
  18. 整数的上下取整和浮点数的上下取整 java
  19. 医院住院管理信息系统设计说明书+源码
  20. 独立钻石跳棋问题的C++实现

热门文章

  1. 让OpenCV2.4.9支持虚拟环境python3.5
  2. Python/word.so: undefined symbol: _ZNK4Word7reverseEv
  3. 深度学习(三十六)——R-FCN, FPN, RetinaNet, CornerNet
  4. 顺序执行_执行流程 | 你真的了解Spring AOP的执行顺序吗?
  5. netty的Helloworld---netty学习笔记
  6. Java虚拟机内存区域---学习笔记
  7. Java整合Spring发送邮件
  8. Day45--js基本小结
  9. Winform开发框架之通用短信邮件通知模块
  10. Linux Shell 从入门到删除根目录跑路指南