Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-11-13:谈一谈Android的签名机制?

MoJieBlog opened this issue · comments

  • V1和V2有什么区别?

首先,签名是防止apk信息被修改的一个机制,打包时把apk的信息与证书做处理,生成加密信息,安装时发现问题则拒绝安装
v1签名将apk的其他文件与证书做处理,信息保存到META-INF文件夹里,这么做的主要问题是直接修改apk包体是没法检测出来的,并由此导致了如Janus(CVE-2017-13156)这样的极严重的漏洞(ART支持直接运行dex文件,通过dex头部的魔数进行判断,而应用安装过程中是通过zip尾部的魔数判断是否是有效的zip文件,所以只要构造出一个既是dex又是zip的文件就能绕过签名验证修改里面的dex文件)
v2签名则直接用apk文件,处理之后写入进去,这样修改包体也会被系统检测出从而被拒绝安装

Android的签名机制包含消息摘要、数字签名和数字证书

commented

v1签名:将apk中文件加密保存到META-INF目录中,不包含META-INF目中的文件。生成MANIFEST.MF、CERT.SF、CERT.RSA文件
MANIFEST.MF :保存各文件的SHA-1通过BASE64加密后的值
CERT.SF:保存MANIFEST.MF文件的SHA-1通过Base64加密后的值 和MANIFEST.MF中各项的值再次SHA-1并Base64加密保存
CERT.RSA:保存公钥和发布机构信息

v2签名:对apk整个文件进行分块摘要加密,并把加密信息存在zip**目录前 放在apk sign block区

commented

当面试题要考察你某个技术的理解时,除了他们两个在技术上的区别和特点之外。更希望听到的是在业务上的应用,技术是为业务服务的,展现你的业务能力远比展现你的技术能力要重要。
现在我将从技术和业务应用两个方面来剖析android v1和v2签名的区别。
关于v1和v2两种签名的技术上的区别上面👆已经有很详细的回答了,那么我就说一说他们在业务应用方面的区别:
我们有时候做app推广,需要记录这个APP是通过谁的推广链接安装的,那么我我们只需要在每次通过服务器下发apk的时候对apk文件动一些手脚,在apk中标示这个apk是哪个用户分享的,然后当apk安装好打开时就可以读到apk事先存储好的标示,从而实现我们需要的业务需求。
给apk文件动手脚,v1支持,v1+v2的签名方式就不支持了。

V2
1、更加安全(不可修改),一旦修改则无法安装
2、安装更快(不解压,验证时间缩短)
3、7.0以后的签名方式
建议v1和v2一起使用,7.0以下的手机安装时会使用v1验证,7.0以上的手机使用v2验证

Android 7.0中引入了APK Signature Scheme v2,v1是jar Signature来自JDK。
V1:应该是通过ZIP条目进行验证,这样APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。

V2:验证压缩文件的所有字节,而不是单个 ZIP 条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间(不需要费时地解压缩然后验证),从而加快应用安装速度。

v1和v2的签名使用
1)只勾选v1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式
2)只勾选V2签名7.0以下会直接安装完显示未安装,7.0以上则使用了V2的方式验证
3)同时勾选V1和V2则所有机型都没问题

Andriod Studio 两种签名机制V1和V2的区别