对war包进行签名以及外部验签的学习资料
对war包进⾏签名以及外部验签的学习资料
⼀、⾸先,科普⼀下apk包下的meta-inf⽬录
我们已经知道的是: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系统都⽆法检测出来。)
我们将apk包解包,然后使⽤命令 keytool -printcert -file cert.rsa 查看cert.rsa,如图所⽰:
答案很明显,cert.rsa⽂件中存放了关于签名的信息。
当我们使⽤如下代码获取证书信息的时候:
当使⽤jarsigner 对war包进⾏签名的时候:
⾸先是 MANIFEST.MF ⽂件中多了⼏⾏,它为 jar 包中的每⼀个⽂件都⽣成了⼀个数据摘要,这个摘要是从 jar 包中包含的⽂件本⾝计算出来的;其次,多了⼀个 XXX.SF ⽂件,其中的内容也是 jar 包中每个⽂件对应的摘要,但是这个摘要是从 MANIFEST.MF 中的数据项计算出来的,它同时包含有针对整个 MANIFEST.MF ⽂件计算出的摘要;最后,就是⼀个⽆法直接阅读的⽂件 XXX.DSA,从图中可以看出这个⽂件显⽰为乱码,其中的内容就是 XXX 的公钥以及使⽤ XXX 的私钥对该 jar ⽂件进⾏签名后的结果。
有了这⾥的直观的印象,我们就对签名和验证有了更深⼊的了解。签名和验证是建⽴在信息摘要算法和⾮对称加密解密算法的基础上的。数据摘要算法是不可逆的,它只能从数据⽣成摘要,不能从摘要解密出数据。⾮对称加密解密算法需要公钥私钥对,使⽤私钥加密的数据只能使⽤公钥解密,因此使⽤私钥对上⼀步⽣成的摘要进⾏加密,就相当于是签名了,因为只能通过相应的公钥进⾏解密。⼀般情况下公钥是通过证书发布出去的,⽽在上⾯的例⼦中,签名者的公钥直接放在了 YOUXIA.DSA ⽂件中,⽅便验证者使⽤。

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