安卓学习笔记

APK ROM 签名原理

2017-12-02  本文已影响0人  笑羋

转载:

http://blog.csdn.net/kickxxx/article/details/18252881

http://www.cloudchou.com/android/post-379.html

前言

这些天有人问我关于APK或者ROM签名的原理,因为先前接触过签名的东西,就想当然地认为在META-INF下存在3个文件,

一个是清单文件MANIFEST.MF,一个是签名后的CERT.SF,一个是公钥文件CERT.RSA,网上不少资料也是这样的观点。后来查看了签名工

具的源代码才发现大错特错,CERT.SF根本不是用私钥对MANIFSET.MF签名后的文件,只是对MANIFEST.MF的每个条目再次计算摘要后

的文件。现在想想凡事不可轻易断言,还是实事求是才能找到真理。接下来将根据源码详细分析APK或者ROM签名的原理。

什么是签名

首先我们得知道什么是摘要,摘要是指采用单向Hash函数对数据进行计算生成的固定长度的Hash值,摘要算法有Md5,Sha1等,Md5生成的

Hash值是128位的数字,即16个字节,用十六进制表示是32个字符,Sha1生成的Hash值是160位的数字,即20个字节,用十六进制表示是

40个字符。我们是不能通过摘要推算出用于计算摘要的数据,如果修改了数据,那么它的摘要一定会变化(其实这句话并不正确,只是很难正好找到不同的数据,

而他们的摘要值正好相等)。摘要经常用于验证数据的完整性,很多下载网站都会列出下载文件的md5值或者sha1值。

摘要和签名没有任何关系,网上常常将摘要和签名混为一谈,这是错误的。签名和数字签名是同一个概念,是指信息的发送者用自己的私钥对消息摘要加密产

生一个字符串,加密算法确保别人无法伪造生成这段字符串,这段数字串也是对信息的发送者发送信息真实性的一个有效证明。其他发送者用他们的私钥对同一个消

息摘要加密会得到不同的签名,接收者只有使用发送者签名时使用的私钥对应的公钥解密签名数据才能得到消息摘要,否则得到的不是正确的消息摘要。

数字签名是非对称密钥加密技术+数字摘要技术的结合。

数字签名技术是将信息摘要用发送者的私钥加密,和原文以及公钥一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的信息摘要,然后接收者用相同的Hash函数对收到的原文产生一个信息摘要,与解密的信息摘要做比对。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改;不同则说明信息被修改过,因此数字签名能保证信息的完整性。并且由于只有发送者才有加密摘要的私钥,所以我们可以确定信息一定是发送者发送的。

另外还需要理解一个概念:数字证书。数字证书是一个经证书授权中心数字签名的包含公钥及其拥有者信息的文件。数字证书的格式普遍采用的是X.509V3国际标准,一个标准的X.509数字证书包含以下一些内容:证书的版本信息:

1)证书的序列号,每个证书都有一个唯一的证书序列号;2)证书所使用的签名算法;3)证书的发行机构名称,命名规则一般采用X.500格式;4)证书的

有效期,通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;5)证书所有人的名称,命名规则一般采用X.500格式;6)证书所有人

的公开密钥;7)证书发行者对证书的签名。

CERT.RSA包含了数字签名以及开发者的数字证书。CERT.RSA里的数字签名是指对CERT.SF的摘要采用私钥加密后的数

据,Android系统安装apk时会对CERT.SF计算摘要,然后使用CERT.RSA里的公钥对CERT.RSA里的数字签名解密得到一个摘要,比

较这两个摘要便可知道该apk是否有正确的签名,也就说如果其他人修改了apk并没有重新签名是会被检查出来的。

需注意Android平台的证书是自签名的,也就说不需要权威机构签发,数字证书的发行机构和所有人是相同的,都是开发者自己,开发者生成公私钥对后不需要提交到权威机构进行校验。

总结:

一个xxx.apk解压后有METO_INF目录,里面有三个文件

1.一个是清单文件MANIFEST.MF

2.一个是签名后的CERT.SF

3.一个是公钥文件CERT.RSA

查看apk签名 和 keystore 的信息

转载:http://janrone.com/2015/12/29/%E6%9F%A5%E7%9C%8Bapk%E7%AD%BE%E5%90%8D-%E5%92%8C-keystore-%E7%9A%84%E4%BF%A1%E6%81%AF/

1、查看 keystore

$ keytool -list -v -keystore debug.keystore

$ keytool -list -v -keystore debug.keystore

Enter keystore password:

*****************  WARNING WARNING WARNING  *****************

* The integrity of the information stored in your keystore  *

* has NOT been verified!  In order to verify its integrity, *

* you must provide your keystore password.                  *

*****************  WARNING WARNING WARNING  *****************

Keystore type: JKS

Keystore provider: SUN

Your keystore contains 1 entry

Alias name: androiddebugkey

Creation date: Apr 8, 2015

Entry type: PrivateKeyEntry

Certificate chain length: 1

Certificate[1]:

Owner: CN=Android Debug, O=Android, C=US

Issuer: CN=Android Debug, O=Android, C=US

Serial number: 509aeb88

Valid from: Wed Apr 08 20:48:48 CST 2015 until: Fri Mar 31 20:48:48 CST 2045

Certificate fingerprints:

MD5:  38:43:E1:B6:AB:F2:7F:80:93:CD:E5:EF:75:B9:A5:6C

SHA1: 9D:53:DB:6C:DA:D4:08:B3:D4:A6:E5:26:17:BD:80:FA:5A:E4:4F:AB

SHA256: D5:FF:04:4A:A2:F8:A4:EA:2A:44:53:28:0C:20:16:45:E8:71:AC:B1:74:76:F6:B4:01:90:86:83:73:E0:B0:8A

Signature algorithm name: SHA256withRSA

Version: 3

Extensions:

#1: ObjectId: 2.5.29.14 Criticality=false

SubjectKeyIdentifier [

KeyIdentifier [

0000: B2 FF B2 0D 9C 54 BA BA  A2 EF E3 BA E2 47 90 7F  .....T.......G..

0010: 17 8A 35 A8                                        ..5.

]

]

*******************************************

2、查看三方应用或是系统应用签名

打开待查看的apk,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件

$ keytool -printcert -file META-INF/CERT.RSA

打开待查看的apk,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件$ keytool -printcert -file META-INF/CERT.RSAOwner: CN=Android Debug, O=Android, C=USIssuer: CN=Android Debug, O=Android, C=USSerial number: 514ab2e1Valid from: Thu Mar 21 15:12:33 CST 2013 until: Sat Mar 14 15:12:33 CST 2043Certificate fingerprints:(Md5生成的Hash值是128位的数字,即16个字节,用十六进制表示是32个字符,Sha1生成的Hash值是160位的数字,即20个字节,用十六进制表示是40个字符)MD5:  E0:F4:90:EE:CD:77:17:0E:B8:C4:AC:64:B2:F6:FC:83SHA1: 7F:E5:11:D8:37:4F:DA:D7:75:EA:A5:8C:47:06:85:95:6D:1D:3F:2BSignature algorithm name: SHA1withRSAVersion: 3

3、给空白包签名 (注意 alias 值)

jarsigner -verbose -keystore [keystorePath] -signedjar [apkOut] [apkIn] [alias]

jarsigner命令格式:-verbose输出详细信息 -keystore密钥库位置 -signedjar要生成的文件 要签名的文件 密钥库文件

keystorePath参数代表keyStore的绝对路径,如D:\keystore

apkOut参数代表签名后的apk路径,如D:\signed.apk

apkin参数代表在腾讯应用中心下载的未签名apk,默认名称为tap_unsign.apk

alias参数代表签名用的alias名称(创建keyStore时所填写),如timdong

$ jarsigner -verbose -keystore debug.keystore -signedjar test2.apk tap_unsign1.apk timdong

Enter Passphrase for keystore:

adding: META-INF/MANIFEST.MF

adding: META-INF/ANDROIDD.SF

adding: META-INF/ANDROIDD.RSA

signing: res/drawable/ic_launcher.png

signing: res/layout/main.xml

signing: AndroidManifest.xml

signing: resources.arsc

signing: classes.dex

上一篇下一篇

猜你喜欢

热点阅读