Android签名原理概述

前提

看懂这篇文章需要你对加解密算法、摘要算法有一定的了解,不了解可以先看这篇加密算法简介

正文

我们已经知道的是:Android对每一个Apk文件都会进行签名,在Apk文件安装时,系统会对其签名信息进行比对,判断程序的完整性,如果是覆盖已安装程序,则会对比新旧APK签名是否一致,从而决定该Apk文件是否可以安装,在一定程度上达到安全的目的。
给定一个Apk文件,解压,可以看到一个META-INFO文件夹,在该文件夹下有三个文件:分别为MANIFEST.MFCERT.SFCERT.RSA。这三个文件分别表征以下含义:

(1)MANIFEST.MF:这是摘要文件。

程序遍历Apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。如果你改变了apk包中的文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFEST.MF的检验信息不同,于是程序就不能成功安装。
说明:如果攻击者修改了程序的内容,有重新生成了新的摘要,那么就可以通过验证,所以这是一个非常简单的验证。

(2)CERT.SF:这是对摘要的签名文件。

对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。
说明:在这一步,即使开发者修改了程序内容,并生成了新的摘要文件,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件(CERT.SF)。系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件(MANIFEST.MF)对应不起来,所以不能通过检验,不能成功安装文件。

(3)CERT.RSA文件是一个X.509格式证书,如图所示。

注意:图中展示的是CERT.RSA文件中证书内容(图中的签名值 Signature Algorithm: sha256WithRSAEncryption是对证书内容摘要并使用私钥签名(即sha256WithRSAEncryption算法)计算而来的,用于校验公钥自身是否被篡改),而实际在CERT.RSA文件的末尾,还保存了附加信息:对CERT.SF的sha256WithRSAEncryption计算出的签名值(注意:是CERT.SF的签名值),如果apk的内容变动,则附加信息(即CERT.SF的签名值)一定也会改变。
说明:系统对CERT.SF文件进行签名校验,所需要的公钥就是从证书里取出来的,由于证书中包含了证书签名信息,我们可以在代码中预埋证书签名信息,校验证书中的签名是否一致,防止第三方使用他的私钥重新签名apk。

Android签名原理概述_第1张图片
使用 openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text 命令查看证书内容

总结

Android中的签名指的是什么?

在CERT.RSA文件中有两个签名信息,一个是证书的签名信息,另一个是证书附加信息中CERT.SF的签名信息。

证书自身的签名信息可以用于校验apk是否被第三方重新打包,当第三方使用自己的私钥签名apk时,其生成的证书的签名值与我们生成的证书签名值不同,因此可以在此处进行校验。

附加信息中的CERT.SF的签名信息在apk安装时,安装器会重新CERT.SF的签名内容与附加信息中的CERT.SF的签名信息进行对比判断apk是否被篡改。

通常我们所说的签名是指证书的签名信息。

你可能感兴趣的:(Android签名原理概述)