技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Android开发 --> Android APK 签名文件MANIFEST.MF、CERT.SF、CERT.RSA分析

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

浏览:1499次  出处信息

   首先我们找一个已经签名的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. 公钥私钥加密解密数字证书数字签名详解    (阅读:4011)
  2. java 安全沙箱模型详解    (阅读:2404)
  3. FakeID签名漏洞分析及利用(Google Bug 13678484)    (阅读:953)
  4. 编译 RenderDoc 的安卓 apk(带interceptor-lib)    (阅读:824)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1