META-INFO文件夹解析
META-INFO⽂件夹解析
⼀、Android签名概述
我们已经知道的是:Android对每⼀个Apk⽂件都会进⾏签名,在Apk⽂件安装时,系统会对其签名信息进⾏⽐对,判断程序的完整性,从⽽决定该Apk⽂件是否可以安装,在⼀定程度上达到安全的⽬的。
给定⼀个Apk⽂件,解压,可以看到⼀个META-INFO⽂件夹,在该⽂件夹下有三个⽂件:分别
为MANIFEST.MF、CERT.SF和CERT.RSA。这三个⽂件分别表征以下含义:
(1)MANIFEST.MF:这是摘要⽂件。程序遍历Apk包中的所有⽂件(entry),对⾮⽂件夹⾮签名⽂件的⽂件,逐个⽤SHA1⽣成摘要信息,再⽤Base64进⾏编码。如果你改变了apk包中的⽂件,那么在apk安装校验时,改变后的⽂件摘要信息与MANIFEST.MF的检验信息不同,于是程序就不能成功安装。
说明:如果攻击者修改了程序的内容,有重新⽣成了新的摘要,那么就可以通过验证,所以这是⼀个⾮常简单的验证。
(2)CERT.SF:这是对摘要的签名⽂件。对前⼀步⽣成的MANIFEST.MF,使⽤SHA1-RSA算法,⽤开发者的私钥进⾏签名。在安装时只能使⽤公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF⽂件)进⾏对⽐,如果相符,则表明内容没有被异常修改。
说明:在这⼀步,即使开发者修改了程序内容,并⽣成了新的摘要⽂件,但是攻击者没有开发者的私钥,所以不能⽣成正确的签名⽂件(CERT.SF)。系统在对程序进⾏验证的时候,⽤开发者公钥对不正确的签名⽂件进⾏解密,得到的结果和摘要⽂件(MANIFEST.MF)对应不起来,所以不能通过检验,不能成功安装⽂件。
(3)CERT.RSA⽂件中保存了公钥、所采⽤的加密算法等信息。
说明:系统对签名⽂件进⾏解密,所需要的公钥就是从这个⽂件⾥取出来的。
结论:从上⾯的总结可以看出,META-INFO⾥⾯的说那个⽂件环环相扣,从⽽保证Android程序的安全性。(只是防⽌开发者的程序不被攻击者修改,如果开发者的公私钥对对攻击者得到或者开发者开发出攻击程序,Android系统都⽆法检测出来。)
⼆、在Eclipse下配置App的签名信息
对App进⾏签名的⽅式⼀般有以下⼏种:通过Google提供的签名⼯具,通过某些开发者开发的签名⼯具或者通过Eclipse提供的签名⽅法,但⼀般⽽⾔,他们都是在下层调⽤Google提供的签名⼯具,所以签名的⽅法都相同。
例如,在Eclipse下⾯配置签名信息时,可以设置开发者信息:
说明:从上图可以看出,在Eclipse中,可以设置开发者的详细信息。在其他的签名⼯具中,可能会直接调⽤其他签名信息。
值得注意的是,在设置签名信息的时候,会有如下图所⽰的步骤:
请暂且记住这⾥有认证指纹信息:MD5和SHA1。由于这⼀步骤是在编译⽣成Apk⽂件之前进⾏的,所以,说明这⾥的MD5和SHA1与程序的内容毫⽆关系,只与开发者的公私钥对等开发信息有关。
我们⾃⼰设置签名信息之后开发程序并签名,得到的签名信息经过解析结果如下:
说明:由上图可以发现,解析结果中的MD5和SHA1与上⾯得到的MD5,SHA1是相同的。
三、同⼀个公司的不同App的签名有关系吗?
我们有⼀个疑问,许多互联⽹⼤公司会开发许多官⽅的移动应⽤,那么这些应⽤的签名信息是否相同呢,他们所⽤的公私钥对是否都是⼀样的?我们对Tencent公司的QQ,QQ空间,三款产品进⾏解析,得到下⾯的结果和结论。
1、使⽤
使⽤Java提供的⼯具对三款产品的签名情况(CERT.RSA⽂件)进⾏解析,情况如下所⽰。
QQ:
QQ空间:
说明:从上⾯的三幅图可以看出,虽然同为Tencent的三款产品,但是他们的所有者信息、签发⼈信息等都不尽相同,尽管他们都表⽰了腾讯公司或者Tencent等信息。因为这是开发者⾃⼰设置的,⽽且和QQ属于不同的事业部,办公地点不同,所以他们的签名信息不同也就不⾜为奇了。
qq空间签名大全
2、⾃⼰写应⽤提取
⾃⼰写程序从CERT.RSA提取出公钥信息和证书中的签名信息(对开发者信息的签名,例如姓名,公司,国家等。。。),情况如下:
由于都是⼀些字符,且很多,所以只取开始和结束的⼏位⽐特做⼀说明:
公钥:5e9f
签名:3082 (1949)
QQ:
公钥:a15e (3695)
签名:3082 (2049)
QQ空间:
公钥:82d (445)
签名:3082 (1677)
说明:由于三款App的开发者设置的签名信息⼏乎不同,使⽤的公私钥对都不同,所以这⾥取出来的公钥和签名信息⼏乎不同。唯⼀相同的是三款App的签名的开始⼀些⽐特,可能是因为有的信息相同,具体不得⽽知。
四、同⼀款App的不同版本签名信息有关系吗?
为了说明这个问题,我们对QQ的两个版本做了检测,情况如下:
QQ4.7.0:
公钥:a15e (3695)
签名:3082 (2049)
QQ4.6.2:
公钥:a15e (3695)
签名:3082 (2049)
说明:QQ的两个不同版本,从CERT.RSA⽂件中取出的公钥和签名信息,完全相同。说明QQ开发团队始终使⽤的是⼀个相同的公私钥对。当然,他们对于不同的版本使⽤不同的公私钥对也是可以的,也是可能的。这种可能性发⽣在他们主动更改公私钥对的情况下,也可能发⽣在他们⽤不同的环境进⾏签名的情况下。
五、可以修改META-INFO⽂件夹下的⽂件吗?
(1)CERT.RSA,CERT.SF的⽂件名可以修改。
我们把CERT.SF的⽂件名改成CERT1.SF,把CERT.RSA的⽂件名改成CERT1.RSA,原来的Apk⽂件可以被成功安装。
说明:Android系统在检测的时候,不会⼀定要到CERT这种⽂件名,是按照⽂件类型来检测的。但是,如果.RSA⽂件与.SF⽂件的名字不同,那么就不能成功安装。
(2)添加⾃⼰的CERT.SF和CERT.RSA⽂件到META-INFO⽂件夹下⾯,不能成功。
说明:在(1)的基础上,我们执⾏(2)操作,不能成功安装,这是因为Android系统不到摘要⽂件与(2)中添加上的两个⽂件进⾏对应。
六、不同的签名应⽤,得到的结果可能不同。
⽤Eclipse签名的Apk⽂件,解析CERT.RSA⽂件之后得到的结果如下:
⽤Dodo Apktools签名后的Apk⽂件解析之后结果如下:
说明:⽤Dodo签名的解析⽂件多了后⾯的扩展部分,但总体内容不变。
七、应⽤商店⽤什么⽅式检测官⽅版?
豌⾖荚推出的洗⽩⽩功能很受欢迎,那么他们是如何辨别App的是否是官⽅出品的呢?
根据搜集到的资料,他们CEO说是这样实现的:将商店⾥的App与官⽹上的App签名做对⽐。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。