Android开发Android开发Android开发经验谈

Android apk签名机制

2020-08-31  本文已影响0人  奔跑吧李博
什么是数字签名?

数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的。

为什么要数字签名?

系统要求的。 Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的。这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。

那我们在平时开发中,直接运行程序没有签名怎么将apk安装上了呢?其实也是进行了签名的,是AS给apk用了默认的签名文件。

APK程序的两种模式:调试模式(debugmode)和发布模式(release mode)

在调试模式下,ADT会自动的使用debug密钥为应用程序签名,因此我们可以直接运行程序。

数字证书的要点

1.所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序 。

2.Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证。

3.如果要正式发布一个Android,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。

4.数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

5.Android使用标准的java工具 Keytool andJarsigner 来生成数字证书,并给应用程序包签名。

签名后的apk分析:

对一个APK文件签名之后,APK文件根目录下会增加META-INF目录,该目录下增加三个文件:

MANIFEST.MF
CERT.SF
CERT.RSA

签名原理

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

MANIFEST.MF:

保存了所有文件的SHA-1并base64编码后的值


CERT.SF:

SHA1-Digest-Manifest的值,这个值就是MANIFEST.MF文件的SHA-1并base64编码后的值。

CERT.RSA:

包含了公钥信息和发布机构信息。它把之前生成的 CERT.SF文件, 用私钥计算出签名, 然后将签名以及包含公钥信息的数字证书一同写入 CERT.RSA 中保存。

上一篇下一篇

猜你喜欢

热点阅读