Android签名机制之---签名过程详解

一、准备知识

1、数据摘要

其实他也是一种算法,就是对一个数据源进行一个算法之后得到一个摘要,也叫作数据指纹,不同的数据源,数据指纹肯定不一样,就和人一样。
消息摘要的主要特点有:

1)无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。
2)一般来说(不考虑碰撞的情况下),只要输入的原始数据不同,对其进行摘要以后产生的消息摘要也必不相同。
3)具有不可逆性,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的原始消息。
注意:
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

2、签名文件和证书

所谓数字签名,它是对前面提到的非对称加密技术与数字摘要技术的一个具体的应用。

发送者有一天想给消息接收者发消息,还要加上另外一段消息,这段消息通过如下两步生成:
1)对要发送的原始消息提取消息摘要;
2)对提取的信息摘要用自己的私钥加密。
通过这两步得出的消息,就是所谓的原始信息的数字签名。

而对于信息的接收者来说,他将通过以下三步来验证消息的真伪:
1)对原始消息部分提取消息摘要,注意这里使用的消息摘要算法要和发送方使用的一致;
2)对附加上的那段数字签名,使用预先得到的公钥解密;
3)比较前两步所得到的两段消息是否一致。如果一致,则表明消息确实是期望的发送者发的,且内容没有被篡改过;相反,如果不一致,则表明传送的过程中一定出了问题,消息不可信。

但是,这种数字签名方法,有一个前提,就是消息的接收者必须要事先得到正确的公钥:这就要靠数字证书来解决了。
数字证书包含发送方的公钥数字签名及其所用的算法。

可以看出,数字证书其实也用到了数字签名技术。只不过要签名的内容是消息发送方的公钥,以及一些其它信息。但与普通数字签名不同的是,数字证书中签名者不是随随便便一个普通的机构,而是要有一定公信力的机构。这就好像你的大学毕业证书上签名的一般都是德高望重的校长一样。一般来说,这些有公信力机构的根证书已经在设备出厂前预先安装到了你的设备上了。所以,数字证书可以保证数字证书里的公钥确实是这个证书的所有者的,或者证书可以用来确认对方的身份。数字证书主要是用来解决公钥的安全发放问题。

这里写图片描述
二、签名工具及过程
3、jarsign和signapk工具

jarsign是Java本生自带的一个工具,他可以对jar进行签名的。而signapk是后面专门为了Android应用程序apk进行签名的工具,他们两的签名算法没什么区别,主要是签名时使用的文件不一样,这个就要引出第三个问题了。

4、keystore文件和pk8,x509.pem文件的区别

jarsign工具签名时使用的是keystore文件

signapk工具签名时使用的是pk8,x509.pem文件

其中我们在使用Eclipse工具写程序的时候,出Debug包的时候,默认用的是jarsign工具进行签名的,而且Eclipse中有一个默认签名文件
这里写图片描述

我们看到上面有MD5和SHA1的摘要,这个就是keystore文件中私钥的数据摘要。

5、手动的签名Apk包

1》使用keytool和jarsigner来进行签名

当然,我们在正式签名处release包的时候,我们需要创建一个自己的keystore文件:

这里写图片描述
这里写图片描述
这里我们可以对keystore文件起自己的名字,而且后缀名也是无关紧要的。创建完文件之后,也会生成MD5和SHA1的值,这个值可以不用记录的,可以通过命令查看keystore文件的MD5和SHA1的值。

keytool -list -keystore debug.keystore
这里写图片描述

当然我们都知道这个keytstore文件的重要性,说白了就相当于你的银行卡密码。你懂得。

这里我们看到用Eclipse自动签名和生成一个keystore文件,我们也可以使用keytool工具生成一个keystore文件。然后我们可以使用jarsign来对apk包进行签名了。

我们可以手动的生成一个keystore文件:

keytool -genkeypair -v -keyalg DSA -keysize 1024 -sigalg SHA1withDSA -validity 20000 -keystore D:\jiangwei.keystore -alias jiangwei -keypass jiangwei -storepass jiangwei
这里写图片描述

这个命令有点长,有几个重要的参数需要说明:

-alias是定义别名,这里为debug

-keyalg是规定签名算法,这里是DSA,这里的算法直接关系到后面apk中签名文件的后缀名,到后面会详细说明

在用jarsigner工具进行签名

jarsigner -verbose -sigalg SHA1withDSA -digestalg SHA1 -keystore D:\jiangwei.keystore -storepass jiangwei D:\123.apk jiangwei
这里写图片描述

这样我们就成功的对apk进行签名了。

签名的过程中遇到的问题:

1》证书链找不到的问题
这里写图片描述
这个是因为最后一个参数alias,是keystore的别名输错了。

2》生成keystore文件的时候提示密码错误
这里写图片描述
这个原因是因为在当前目录已经有debug.ketystore了,在生成一个debug.keystore的话,就会报错

3》找不到别名的问题
这里写图片描述

这个问题的原因是因为我们在使用keytool生成keystore的时候,起了debug的别名,这个问题困扰了我很久,最后做了很多例子才发现的,就是只要我们的keystore文件的别名是debug的话,就会报这样的错误。这个应该和系统默认的签名debug.keystore中的别名是debug有关系吧?没有找到jarsigner的源码,所以只能猜测了,但是这三个问题在这里标注一下,以防以后在遇到。

三、分析Android中签名流程机制

下面我们开始从源码的角度去看看Android中的签名机制和原理流程

因为网上没有找到jarsigner的源码,但是找到了signapk的源码,那么下面我们就来看看signapk的源码吧:

源码位置:com/android/signapk/sign.java

通过上面的签名时我们可以看到,Android签名apk之后,会有一个META-INF文件夹,这里有三个文件:

MANIFEST.MF

CERT.RSA

CERT.SF

下面来看看这三个文件到底是干啥的?

1、MANIFEST.MF
这里写图片描述
们来看看源码:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值