android 关于利用签名的关于利用签名的SHA1进行安全校验的方法之一进行安全校验的方法之一(推荐推荐)
下面小编就为大家带来一篇android 关于利用签名的SHA1进行安全校验的方法之一(推荐)。小编觉得挺不错的,
现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
最近做安卓项目中使用到了百度地图的API,在申请百度地图key的时候,需要我们填入“签名的SHA1”和“客户端包名”,然后
百度为我们生成一个key。
于是就引发了思考,百度为何需要我们客户端签名的于是就引发了思考,百度为何需要我们客户端签名的SHA1值呢?值呢?
第一想法就是:百度拿我们输入的参数SHA1和包名进行一些列算法计算,生成一个key返回给我们。
为了证明这个想法,写了demo进行测试,android获取包名的方法很简单,但是我们还需要从客户端中获取keystore的指纹
SHA1。
进行各种资料的查找和分析,才得出方法。
一、首先,科普一下一、首先,科普一下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文件中存放了关于签名的信息。
当我们使用如下代码获取证书信息的时候:
/**
* 获取指定包名程序的签名信息
*
* @param context
* @param packName
* @author SHANHY