Android apk签名机制

什么是数字签名?

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

为什么要数字签名?

系统要求的。 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-256并base64编码后的值


CERT.SF:

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

CERT.RSA:

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

v1 签名方案

v1 签名方案,并不会保护 Apk 内的所有内容,有一些例外部分,被修改也并不会导致签名失效。例如:ZIP 元数据。

这样,在验证 APK 签名的时候,就需要处理大量不可信(尚未经过验证)的数据结构,然后还需要过滤并舍弃掉这部分不受签名保护的数据,再进行签名校验。也就是说你可以在已签名的文件中,增加一些不被签名保护的内容,这将导致受攻击的可能增大。

v2 签名方案

APK 签名方案 v2 是一种全文件的签名方案,该方案能够对 APK 所有受保护的部分进行签名保护,从能能够发现它们被篡改。

在 APK 验证期间,v2 方案会将 APK 文件视为 Blob,并对整个文件进行签名检查。对 APK 进行的任何修改(包括对 ZIP 元数据的修改),都会使 APK 签名作废。

参考:http://source.android.com/security/apksigning/v3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容