apk签名详解

来源:互联网 发布:2016网络原创歌曲比赛 编辑:程序博客网 时间:2024/06/10 21:14

一,加密介绍—–数据摘要:
数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列算法。(百度百科)。

1,CRC(Cyclic Redundancy Check,循环冗余校验)

2、MD2 、MD4、MD5
Ron Rivest(RSA公司)在1992年提出,被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等。都产生16字节(128位)的校验值,一般用32位十六进制数表示。MD2的算法较慢但相对安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。

3、SHA1、SHA256、SHA384、SHA512
SHA系列算法的摘要长度分别为:SHA为20字节(160位)、SHA256为32字节(256位)、 SHA384为48字节(384位)、SHA512为64字节(512位),由于它产生的数据摘要的长度更长,因此更难以发生碰撞,因此也更为安全,它是未来数据摘要算法的发展方向。由于SHA系列算法的数据摘要长度较长,因此其运算速度与MD5相比,也相对较慢。

4、RIPEMD、PANAMA、TIGER、ADLER32 等(详见百科)。

    这里重点说一下MD5,中文名称 信息摘要算法或哈希算法。简单说发就是讲任意一个长度字节数的字符串变成一定长度的十六进制数字串,目前在数字签名软件签署私人秘钥之前压缩的一种保密格式。

Hash(散列函数):简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

主要特点:        1,固定长度        2,不可逆        3,输入输出结果确定。

总结:
MD5、SHA1虽然被发现存在缺陷(碰撞),但在近几年内,仍然可以大量使用。 关于MD5使用泄密事件,2013年雅虎五亿用户泄密事件,2014年十亿用户遭到泄密悲剧。

二,在实际应用中的签名使用。
下面来看一下关于对Apk签名的两种方式,下面我们只介绍的jarsigner方式。

1,signapk是android自带的签名工具signapk.jar,我们重点不在这里便不多介绍,具体使用方式可以在网上查询。

2,jarsigner是JDK中带的签名工具,jarsigner可以生成我们平时使用的数字签名证书keystore,另外可以通过eclipse或者android studio工具进行创建皆可,网上有大量的介绍。

jarsigner与signapk签名区别

   1,jarsigner签名时,需要的是keystore文件,而signapk签名的时候是pk8,x509.pem文件。   2,jarsigner签名是eclipse中默认的签名方式。   3,keystore文件和pk8,x509.pem文件之间可以互相转化。

签名机制流程:

    1、对Apk中的每个文件做一次算法(数据摘要+Base64编码),保存到MANIFEST.MF文件中    2、对MANIFEST.MF整个文件做一次算法(数据摘要+Base64编码),存放到CERT.SF文件的头属性中,在对MANIFEST.MF文件中各个属性块做一次算法(数据摘要+Base64编码),存到到一个属性块中。    3、对CERT.SF文件做签名,内容存档到CERT.RSA中

参考来源: http://blog.csdn.net/jiangwei0910410003/article/details/50443505

    关于MANIFEST.MF文件的查看方法可以对apk进行zip解压之后进行查看,可以看到对方法进行计算后的算法提取数据,所以这也是签名无法复制的原因。

下面对apk的签名校验方式做个总结:

证书指纹查看方式1,对于已经签名的apk签名查看    用winrar解压缩apk,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件    输入命令执行$ keytool -printcert -file META-INF/CERT.RSA即可查看签名2,对鱼keystore或jks文件可以在SDK的build-tools目录下进行查看    在jdk  bin目录中输入下方命令:         $ keytool -list -keystore debug.keystore 输入密钥库口令:  密钥库类型: JKS 密钥库提供方: SUN  您的密钥库包含 1 个条目 xxx.keystore, 2013-11-2, PrivateKeyEntry, 证书指纹 (SHA1): E7:6B:AA:AC:BD:7F:0C:XXXXXXXXXXXXXXXXX3,如何使用命令行方式进行签名?1.首先进入到JDK的bin目录下打开命令行窗口2.输入命令jarsigner进行测试命令执行是否成功3.进行签名, C:\XXX\bin>jarsigner -verbose -keystore gameplay.jks -signedjar game_sign.apk  game_unsign.apk aliars注意签名结束之后别忘了对文件进行对齐优化!      在SDK\build-tools下面找到zipalign.exe文件,在当前文件中打开命令窗口。输入下面命令可以进行对齐优化。优化APK:zipalign -v 4 MyDemo_signed.apk MyDemo_new.apk查循APK是否优化过:zipalign -c -v 4 MyDemo.apk
原创粉丝点击