前言
书接上回【Android签名机制详解】一:密码学入门,在了解了消息摘要、非对称加密、数字签名、数字证书的基本概念后,我们趁热打铁、直奔主题,讲解签名在Android中的实际应用。
基础知识
Android的数字证书(.der 或 .pem )是存放在密钥库文件(.jks 或 .keystore)当中的,而数字证书作用就是保管公钥。除此之外,密钥库中还存有私钥。
Android的数字证书和传统数字证书有很大的不同,它是根证书,也就是自认证的证书,颁发者和使用人是同一个,也就是说我们自己即是CA机构,又是证书使用者。所以,Android系统在安装APK的过程中并不会校验证书的合法性,只是从中提取公钥和算法。Google这样做的目的是为了降低开发成本,吸引更多的人来开发Android应用,巩固Android生态圈。毕竟正儿八经的证书申请是要花钱的。
但是,这也就会导致一个很严重的问题,就是Android证书没有权威性
,任何人都可以制作。攻击者可以篡改APK里的内容,替换掉原来的签名和证书,重新生成一份自己的签名和证书(所谓的重签名
),再二次发行,谋取利益。那怎么办呢?
其实应用安全是每个Android开发者都应该关心的。大公司会有专门的部门对APP的进行安全加固,小公司或个人也可以购买第三方的加固服务。
我们也可以在APK里面添加校验签名的逻辑,一旦校验失败就停止运行,像支付宝就有这种防止重签名的机制,但道高一尺魔高一丈,Android加固
和Android逆向
了解一下。
言归正传,我们继续讲解Android的签名方案。
目前 Android 支持以下四种应用签名方案:
V1签名方式也称作Jar签名,顾名思义,Jar 包也是用这种方式进行签名检验的。 V1签名并不是Android独有的签名方式。直到Android 7.0开始才推出V2签名,这个就是Android独创的签名方案,与V1签名方式截然不同,完全颠覆以前签名方案。后面Android 9.0又推出了V3签名,再到Android 11推出了V4签名方案,都是在V2的签名架构进行优化升级。所以我们可以把V2、v3、v3划分为一类,称为V2+方案。
V1签名方案
我们对含有V1签名的APK进行解压,部分压缩软件支持直接解压,有些需要修改APK后缀为.zip进行解压。解压后有一个MATE-INF目录,进入后会看到三个文件,分别是 MANIFEST.MF、*.SF 和 *.RSA 。因为*.SF 和*.RSA 具体的文件名是由签名时上下文环境(参数)决定的,所以这边用通配符*代替。
文件分析
MANIFEST.MF文件
这里面保存了除META-INF目录外的所有文件对应的摘要信息。在签名过程中, jarsigner
(签名工具)首先会遍历APK中所有文件, 采用SHA1(JDK7.0之后采用SHA256)算法计算每个文件的16进制的消息摘要,再用 base64 进行编码,将值写入MF文件的一块中。该块有一个“Name”属性,其值就是该文件在APK包中的路径。我们将Name和其对应的摘要称为一个Entry。