APK Signature Scheme v2渠道写入方案分析与实现

使用V2的原因

Android 7.0(Nougat)引入一项新的应用签名方案APK Signature Scheme v2,它是一个对全文件进行签名的方案,能提供更快的应用安装时间、对未授权APK文件的更改提供更多保护.

v2 signature 官方解释

同时V2方案对V1方案做了很好的兼容处理(Apk中同时存在v1,v2签名)。

V1签名

apk-signature-v1-location.png

只是校验了apk资源,并没有约束zip,签名信息存储在zip/META-INF中。

V2 Signature详解

  • V2原理

    使用APK V2签名将在APK中心目录部分之前插入一个APK签名块到APK文件。在APK签名块内,v2签名和签名者身份信息存储在APK Signing Block中。

    那么整个APK(ZIP文件格式)会被分为以下四个区块:

      1. Contents of ZIP entries(from offset 0 until the start of APK Signing Block)
      2. APK Signing Block
      3. ZIP Central Directory
      4. ZIP End of Central Directory
    
    apk-before-after-signing.png

1,3,4是ZIP文件格式,详细的ZIP格式可看:ZIP file_format

  • APK签名块(APK Signing Block)

    为了保持与当前APK格式的向后兼容性,v2和APK签名存储在APK Signing Block内,这是一个新的容器,用于支持V2签名方案。在APK文件中,APK Signing Block位于Contents of ZIP entries末尾和ZIPCentral Directory之前。

    该块包含ID值对,这种方式使得APK更容易找到该块,APK的v2签名存储在ID为0x7109871a的键值对中。

  • APK Signing Block 格式(所有数字字段都是little-endian):

    • size of block 以字节(不包括此字段)(uint64),也就是 APK Signing Block 实际长度为+8

    • uint64长度前缀ID值对的序列:

      • ID (UINT32)
      • value (可变长度:内部键值对的长度 - 4个字节)
    • size of block 以字节为单位,与第一个字段(uint64)相同

    • magic “APK Sig Block 42”(16 bytes)

我们重点来看一下这个ID-value,它由一个8字节的长度标示+4字节的ID+它的负载组成。V2的签名信息是以ID(0x7109871a)的ID-value来保存在这个区块中,不知大家有没有注意这是一组ID-value,也就是说它是可以有若干个这样的ID-value来组成

Offset Bytes Description
0 8 Apk Signing Block 大小,但是不包含本身,也就是实际Block大小需要+8
8 8 键值对的起始标记,存储键值对的大小,也就是后面pair的,key+value 占用的byte
16 4+n key 为 4byte,value 为变化的
@+16 8 Apk Signing Block同上
@+24 16 magic “APK Sig Block 42”
  • 如何找到 APK Signing Block

    首先通过ZIP End of Central Directory中存储的信息找出ZIP Central Directory数据偏移量,然后就可以找到APK Signing Block的位置。
    与此同时存在magic的值为APK Sig Block 42也就表示APK Signing Block的结尾,剩下的通过size of block可以找出APK Signing Block的起始位置。

    End of Central Directory 格式如下:

    EOCD.png
  • 提醒

    Android系统在解释APK Signing Block时,忽略未知ID的键值对。

  • 签名后的APK完整性验证

apk-sections.png

被保护的部分包括1,3,4,这三个部分不能修,但是EOCD中offset of start of central directory,relative to start of archive可以修改。

得到的有用信息

  1. APK Signing Block 是可变的

  2. APK Signing Block是通过已知键值对方式存储,未知ID Android系统将不做处理。

  3. 只需要生成一个基础包,加入渠道信息不用重新打包

APP渠道如何写入

如果一次需要打100渠道包,使用flavors是一件烦人的事情,速度非常慢,有没有更快的方式呢?

V1: setComment 和 META-INF 中写入Channel信息,能解决这个问题,并且速度非常快。

V2:V1的方式不可行,因为签名范围扩大到整个zip,改动后会导致apk无法安装,所以只能通过新方式写入。

实现Demo

AndroidV2SignatureChannelTool

参考文献

apksig源码

v2 signature 官方解释

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容