用python验证Android签名机制

来源:互联网 发布:免费的数据恢复 编辑:程序博客网 时间:2024/06/06 05:25
1.生成MANIFEST.MF文件
对apk中其他文件计算摘要,并对sha1结果进行base64编码
#! /usr/bin/python2.7# _*_coding:utf-8_*_import hashlibimport base64sha1=hashlib.sha1()sha1_2=hashlib.sha1()with open("signed/classes.dex","rb") as fp:  while True:  data=fp.read()  if not data:  break  sha1.update(data)  #print data


print sha1.hexdigest() #输出sha1结果给人看,但是这个方法返回的结果不能直接进行base64编码 这是因为输出结果为了方便查阅转换成了字符串 而不是sha1应该输出的128bit摘要。

print base64.b64encode(sha1.digest())#这个方法返回真正的sha1摘要,对其进行base64编码 得到SHA1-Digest字段的值

在添加上路径信息 实际效果如下:
Manifest-Version: 1.0Created-By: 1.6.0_45 (Sun Microsystems Inc.)Name: res/layout/main.xmlSHA1-Digest: GyYTAfNkRAsjE+8TRMbiIJOPt6U=Name: AndroidManifest.xmlSHA1-Digest: 8d7YxPDWM0IpuaiGDAnMGdJmlZc=Name: res/drawable-xhdpi-v4/ic_launcher.pngSHA1-Digest: UCzYT6RE8m1+z99KNVBkhnl38jY=Name: resources.arscSHA1-Digest: u90+OY03lkRNHcsBtkqq0YVPHz8=Name: classes.dexSHA1-Digest: Ca6Pi4OPdinzAKDZ2qVXZbh+9dM=Name: res/drawable-hdpi-v4/ic_launcher.pngSHA1-Digest: RQ09RDJf3yWYEKYOavo2ED4Yaz0=Name: res/drawable-mdpi-v4/ic_launcher.pngSHA1-Digest: I3MP0NXnINH3Gb4a/IxI+nMF2mw=Name: res/drawable-ldpi-v4/ic_launcher.pngSHA1-Digest: CepliFtAgOUV73Bk6BbHeZHAdXs=


apk安装时系统检查apk中的文件是否与本文件中对应的摘要值匹配,如果不匹配,apk被篡改过,拒绝安装。
但是apk篡改者同时也对MANIFEST.MF文件进行了修改,则无法察觉 ,于是需要第二个文件CERT.SF
2.CERT.SF保证MANIFEST.MF文件不被篡改,且改文件与.RSA文件是成对出现的,apk安装时系统根据文件名(这里是'CERT')寻找相同文件名的.RSA与.SF进行校检
.SF文件生成模拟:
用同样的算法,将文件输入改为
"signed/META-INF/MANIFEST.MF"
输出结果
Signature-Version: 1.0
Created-By: 1.6.0_45 (Sun Microsystems Inc.)
SHA1-Digest-Manifest: 4smrGNh/9QDpvermKcqHS0V+1oM=
SHA1-Digest-Manifest的值。
上面字段作为.sf文件头 接下来为生成.MF文件的每个文件字块生成摘要 不同的是输入应为
Name: res/drawable-hdpi-v4/ic_launcher.pngSHA1-Digest: RQ09RDJf3yWYEKYOavo2ED4Yaz0=


整个记录块,注意整个记录快有三个换行 ,第一个在Name行后,第二个和第三个在最后
把上面的记录块单独保存在文本中,用上面的py程序处理输出值即为.sf中
Name: res/drawable-hdpi-v4/ic_launcher.png记录块的sha1 digest值
.SF文件对.MF文件做摘要记录,保证.MF文件也不被篡改,apk安装时需要根据.SF文件中的记录与.MF做对比,如果不同,则.MF文件被篡改,拒绝安装

从这个步骤来看,.MF和.SF文件的生成只用到了sha1摘要算法和base64编码算法,没有涉及到密钥对,也没有用到keystore文件,我对同一个apk使用不同签名文件进行签名,得到的两个.MF文件相同,两个.SF文件也相同。
(网上一些文章说生成的sf文件是对.mf使用私钥签名的结果,看来是错的)
3.生成.RSA文件
查阅源码,.RSA文件的生成写入了两部分内容 ,即自签名证书(包含公钥以及发布机构 有效期等验证信息)和对.SF文件用私钥进行的签名字段。
这个文件是Android签名机制的根本保障,因为签名用的私钥是apk作者自己保存的,别人无法获得,也就无法伪造对.SF文件的签名,而对于公钥信息,如果修改了公钥信息,就无法对签名文件进行正确的解密,也就完成不了对.SF的验证。
不过如果直接对apk进行重新签名,即将这三个文件都删除 ,然后用jarsigner等工具使用自己的密钥重新啊对apk签名,也是可以通过验证安装的(但不能升级),接下来的安全保证就要对公钥与官方网站发布的公钥进行比对,来验证是否是官方签名的apk了