IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Android APK 签名文件MANIFEST.MF、CERT.SF、CERT.RSA分析

Coder 2016-03-03 14:14:06 累计浏览 2,740 次
本机暂存

   首先我们找一个已经签名的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

   image

   复制该值到winhex中,如下:

   image

   另存为文件sha1,然后使用base64工具对该文件进行base64编码:

   image

   查看base64文件的内容为:TKJzyMwELyakLZYM83o10LERyPQ=

   和上面值完全吻合。

   还可以通过查看源码进行验证:http://androidxref.com/4.4_r1/xref/build/tools/signapk/SignApk.java

   image

   也可以看出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编码后的值。

   源码中也可以看出:

   image

   而后面几项的值是对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文件中的第一项。

   最后一个文件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,把文件复制到这个目录即可。

   image

   最后得到新签名的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时,解决方法是:右键工程属性。

   image然后点击Add:

   image

   总结:不同的程序公钥不同。

   签名校验:

   1.程序自校验,可以把原本的公钥信息(或者.RSA文件)存放到某一文件处,运行时计算当前的公钥信息(或者.RSA文件)与存放的信息是否一致。

   2.联网校验,运行时的公钥信息和服务器端存储的公钥信息进行比对。

同分类推荐文章

  1. 「置顶」我做了什么 (2026-05-05 12:13:28)
  2. 万字长文推演:手机不再从 App 开始,Agent OS 如何接管任务入口 (2026-04-28 14:57:22)
  3. Android Perfetto 系列 10 - Binder 调度与锁竞争 (2025-11-16 15:33:30)

查看更多 移动开发 文章 →

建议继续学习

  1. 情绪版(Mood board)操作流程的新思考 (累计阅读 41,752)
  2. android 开发入门 (累计阅读 19,527)
  3. Android 连接SSID隐藏网络以及 LEAP 认证的方法 (累计阅读 9,539)
  4. 让安卓手机通过代理翻墙的方法 (累计阅读 9,116)
  5. 腾讯php程序员面试题目答案 (累计阅读 8,974)
  6. 手机产品设计方向 (累计阅读 7,953)
  7. 如何设计用户登录 (累计阅读 6,643)
  8. 实时监控Android设备网络封包 (累计阅读 6,557)
  9. Eclipse开发Android应用程序入门:重装上阵 (累计阅读 6,459)
  10. 基于 PhoneGap 与 Java 开发的 Android 应用的性能对比 (累计阅读 6,407)