一、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系统都无法检测出来。)

查看三方应用或是系统应用签名 用winrar打开待查看的apk,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件 1.keytool -printcert -file META-INF/CERT.RSA 命令是:keytool -printcert -file <签名文件RSA的路径> 2.jarsigner -verify -verbose -certs Superuser.apk 此条未验证成功

二、DEBUG.KEYSTORE

1、apk打包的签名文件%ANDROID_SDK_HOME%\.android
2、password:android
3、alias:androiddebugkey
4、type:JKS

三、keytool的几个常用的命令。

1.创建证书
2.查看证书库
3.导出证书文件
4.导入证书的信息
5.查看证书信息
6.删除密钥库中的条目
7.修改证书条目的口令

四、预备知识:

keytool的概念:SUN公司提供了制作证书的工具keytool。在JDK1.4以后的版本中都包含了这一工具,它的位置为\bin\keytool.exe。

1.创建证书
keytool -genkeypair -alias "test1" -keyalg "RSA" -keystore"test.keystore" 

说明:
    密钥库密码为testtest
    证书条目密码为testtest1,若别名为test2则密码为testtest2
       
功能: 
    创建一个别名为test1的证书条目,该条目存放在名为test.keystore的密钥库中,若test.keystore密钥库不存在则创建。
参数:
    -genkeypair:生成一对非对称密钥;
    -alias:指定密钥对的别名,该别名是公开的;
    -keyalg:指定加密算法,本例中的采用通用的RAS加密算法;
    -keystore:密钥库的路径及名称,不指定的话,默认在操作系统的用户目录下生成一个".keystore"的文件
               注意:
1.“名字与姓氏”应该是域名,若输成了姓名,和真正运行的时候域名不符,会出问题;
2.再次输入密码,第一次输入的是密钥库(keystore)的密码,第二次输入的是证书条目的密码
                      3.这里所说的证书库和密钥库是等同的(个人观点)
              
为了测试需要,这里再创建两个别名为test2和test3的证书条目在test.keystore密钥库中,代码如下:
keytool -genkeypair -alias "test2" -keyalg "RSA" -keystore"test.keystore" 
keytool -genkeypair -alias "test3" -keyalg "RSA" -keystore"test.keystore" 
2.查看证书库
keytool -list -keystore test.keystore 

功能:查看名为test.keystore的证书库中的证书条目
3.导出到证书文件
keytool -export -alias test1 -file test.crt -keystore test.keystore 

功能:将名为test.keystore的证书库中别名为test1的证书条目导出到证书文件test.crt中
4.导入证书的信息
keytool -import -keystore test_cacerts -file test.crt  

功能:将证书文件test.crt导入到名为test_cacerts的证书库中
5.查看证书信息
keytool -printcert -file "test.crt"  

功能:查看证书文件test.crt的信息
6.删除密钥库中的条目
keytool -list -keystore test.keystore
删除前查看密钥库test.keysote中的证书条目

keytool -delete -keystore test.keystore -alias test2 
删除密钥库test.keystore中别名为test2的证书条目

keytool -list -keystore test.keystore 
删除后查看密钥库test.keystore中的证书条目
7.修改证书条目的口令
keytool -keypasswd -alias test1 -keystore test.keystore 
功能:将密钥库test.keystore中别名为test1的证书条目的密码修改为testtesttest1

keytool -keypasswd -alias test1 -keypass testtesttest1 -new testtest1-storepass testtest -keystore test.keystore 
功能:将密钥库test.keystore中别名为test1的证书条目的密码修改为testtest1
备注:
获取签名中的MD5:
签名文件:keytool -list -alias androiddebugkey -keystore debug.keystore -storepassandroid -keypass android