APK签名的一些问题

来源:互联网 发布:java快速排序优化 编辑:程序博客网 时间:2024/05/08 22:10

1 签名文件(xx.keystore)的作用?
生成APK文件时必须要经过某个keystore文件的签名,签名的过程实际上是根据keystore文件中的信息生成校验信息和签名信息,以避免APK被篡改
2 如何生成签名文件?
使用jre\bin下的keytool工具,命令如下:
keytool -genkey -alias keytest -keyalg RSA -validity 40000 -keystore mykey.keystore
-genkey 产生密钥
-alias mykey 别名 mykey
-keyalg RSA 使用RSA算法对签名加密
-validity 40000 有效期限4000天
-keystore demo.keystore
执行过程:
输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
[Unknown]: yanvictory
您的组织单位名称是什么?
[Unknown]: union
您的组织名称是什么?
[Unknown]: vitamin
您所在的城市或区域名称是什么?
[Unknown]: hefei
您所在的州或省份名称是什么?
[Unknown]: anhui
该单位的两字母国家代码是什么
[Unknown]: cn
CN=yanvictory, OU=union, O=vitamin, L=hefei, ST=anhui, C=cn 正确吗?
[否]: y

输入的主密码
(如果和 keystore 密码相同,按回车):
再次输入新密码:

3 签名文件里保存的是什么?
从生产keystore文件的过程可以看出,签名文件本身是被加密过的,使用一个密码对签名文件进行保护,可以使用命令查看其内容
D:\my\keystore_demo>keytool -list -keystore mykey.keystore -v
输入keystore密码:

Keystore 类型: JKS
Keystore 提供者: SUN

您的 keystore 包含 1 输入

别名名称: keytest
创建日期: 2016-1-20
项类型: PrivateKeyEntry
认证链长度: 1
认证 [1]:
所有者:CN=yanvictory, OU=union, O=vitamin, L=hefei, ST=anhui, C=cn
签发人:CN=yanvictory, OU=union, O=vitamin, L=hefei, ST=anhui, C=cn
序列号:569f3fee
有效期: Wed Jan 20 16:06:06 CST 2016 至Fri Jul 27 16:06:06 CST 2125
证书指纹:
MD5:43:4F:BE:FD:8B:D4:79:88:37:0A:D1:14:BD:A4:59:12
SHA1:33:B5:D4:A3:6D:5C:56:66:BC:4A:DA:66:96:67:FB:8C:B3:09:BD:13
签名算法名称:SHA1withRSA
版本: 3



keystore文件可以保存多个签名信息,签名信息之间通过别名区分,每个别名都对应一个保护密码以及公钥和私钥。在刚生产的keystore文件中追加一个签名信息
D:\my\keystore_demo>keytool -genkey -alias keytest1 -keyalg RSA -validity 40000 -keystore mykey.keystore
输入keystore密码:
您的名字与姓氏是什么?
[Unknown]: yanyu
您的组织单位名称是什么?
[Unknown]: china
您的组织名称是什么?
[Unknown]: niubi
您所在的城市或区域名称是什么?
[Unknown]: hefei
您所在的州或省份名称是什么?
[Unknown]: anhui
该单位的两字母国家代码是什么
[Unknown]: cn
CN=yanyu, OU=china, O=niubi, L=hefei, ST=anhui, C=cn 正确吗?
[否]: y

输入的主密码
(如果和 keystore 密码相同,按回车):
查看结果:
D:\my\keystore_demo>keytool -list -keystore mykey.keystore -v
输入keystore密码:

Keystore 类型: JKS
Keystore 提供者: SUN

您的 keystore 包含 2 输入

别名名称: keytest1
创建日期: 2016-1-20
项类型: PrivateKeyEntry
认证链长度: 1
认证 [1]:
所有者:CN=yanyu, OU=china, O=niubi, L=hefei, ST=anhui, C=cn
签发人:CN=yanyu, OU=china, O=niubi, L=hefei, ST=anhui, C=cn
序列号:569f42b9
有效期: Wed Jan 20 16:18:01 CST 2016 至Fri Jul 27 16:18:01 CST 2125
证书指纹:
MD5:75:52:99:9D:DB:32:88:F1:AF:7E:44:D1:B2:32:AA:F7
SHA1:B5:25:FC:7F:E8:9E:77:CE:6C:0C:1A:AB:8B:AD:29:6C:F2:D5:E2:5C
签名算法名称:SHA1withRSA
版本: 3



别名名称: keytest
创建日期: 2016-1-20
项类型: PrivateKeyEntry
认证链长度: 1
认证 [1]:
所有者:CN=yanvictory, OU=union, O=vitamin, L=hefei, ST=anhui, C=cn
签发人:CN=yanvictory, OU=union, O=vitamin, L=hefei, ST=anhui, C=cn
序列号:569f3fee
有效期: Wed Jan 20 16:06:06 CST 2016 至Fri Jul 27 16:06:06 CST 2125
证书指纹:
MD5:43:4F:BE:FD:8B:D4:79:88:37:0A:D1:14:BD:A4:59:12
SHA1:33:B5:D4:A3:6D:5C:56:66:BC:4A:DA:66:96:67:FB:8C:B3:09:BD:13
签名算法名称:SHA1withRSA
版本: 3



可以看到有两个签名信息
4 keystore和apk之间的关系
Jarsigner是用来生成apk的签名工具,该工具根据keystore里的信息对程序中的资源文件进行加密运算,并最终生成校验文件,校验文件统一放在META-INF文件夹,任意找一个安装包解压后可以看到这个文件夹。
META-INF文件夹下有三个文件:
(1) MANIFEST.MF:这是摘要文件。程序遍历Apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。如果你改变了apk包中的文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFEST.MF的检验信息不同,于是程序就不能成功安装。如果别人修改了你的资源文件,同时又修改了该文件在MANIFEST.MF中对应的校验值,那么就达到了篡改的目的。
(2) CERT.SF:这是对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。
在这一步,即使开发者修改了程序内容,并生成了新的摘要文件,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件(CERT.SF)。系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件(MANIFEST.MF)对应不起来,所以不能通过检验,不能成功安装文件。
(3) CERT.RSA文件中保存了公钥、所采用的加密算法、签名信息等。
系统对签名文件进行解密,所需要的公钥就是从这个文件里取出来的
CERT.RSA是基于X.509协议的证书,X.509证书格式
这里写图片描述
5 应用更新签名检查
可以推测应用在安装时,系统会用当前的安装包的公钥去尝试解密上个版本用私钥加密的信息,如果能解开,根据私钥和公钥成对的原理说明是同一个签名,如果解不开说明公钥已经变了,继而说明签名不一致,就不能更新
6 APK公钥获取方法
(1) 通过解析apk包中的CERT.RSA文件
(2) 根据PackageInfo中的info.signatures[0],用CertificateFactory certFactory = CertificateFactory.getInstance(“X.509”)解析出公钥,其本质和方法(1)是一样的

0 0
原创粉丝点击