谈谈签名的基本特征、作用、原理、流程和未来发展

一、什么是签名,基本特征有哪些?

    在日常生活中,签名是我们表明身份和授权的一种方式,无论是手写签名还是电子签名,它们都承载着签名者对某个文件内容的确认或对某个事件的授权,签名一般具备以下特征:

  • 独特性 一个签名可以确认唯一的签名主体;
  • 可验证 可以通过签名辨别签名者的身份,这要求签名具备可识别能力和防伪能力;
  • 主体分离 签名作为表明签名者身份的一个事物,不是签名者的一部分,可以独立传递转移;

    在Android应用开发中,签名除了用来验证应用身份,还是保障应用安全和数据完整性的关键技术,下面我们就来详细谈谈Android签名的作用:

二、Android签名的作用是什么?

2.1 身份验证

    Android签名用于验证应用的身份,确保应用来自可靠的开发者或发布者,每个应用都有一个唯一的签名,就像每个人的手写签名一样,用于标识其身份。

2.2 数据完整性保护

    Android签名能确保应用数据在传输和存储过程中没有被篡改。有时间我们在文件上签名或者按指印也会覆盖在重要信息之上,是为了保证重要信息不被篡改;Android上也是如此,签名验证机制能够检测到未经授权的修改。

三、Android签名有哪几种,如何进行签名和验证?

3.1 Android签名有哪些

3.1.1 查看apk签名

apksigner.bat verify -v yourApp.apk 
=>
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): false
Verified using v4 scheme (APK Signature Scheme v4): false

3.1.2 签名配置

1)生成密钥库(Keystore),它包含着用于签名的密钥对。
2)配置Gradle,在App模块的build.gradle中增加以下配置:

android {  
    ...  
    signingConfigs {  
        release {  
            storeFile file('mykeystore.jks') // 密钥库文件位置  
            storePassword 'keystore_password' // 密钥库密码  
            keyAlias 'myalias' // 密钥别名  
            keyPassword 'key_password' // 密钥密码  
            v1SigningEnabled false // 启用V1签名  
            v2SigningEnabled true // 启用V2签名  
            v3SigningEnabled false // 启用V3签名  

        }  
    }  

    buildTypes {  
        release {  
            signingConfig signingConfigs.release // 使用上面定义的签名配置  
            ...  
        }  
    }  
    ...  
}

3.2 v1签名介绍

3.2.1 签名过程

签名命令

// V1签名是基于JDK的签名方式,可以使用jarsigner命令进行签名 (jarsigner --help 得到完整命令说明)
jarsigner -verbose -keystore [keystore路径] -signedjar [签名后apk路径] [待签名apk路径] [keystore别名]
// 执行命令后 会提示输入签名的密码 输入密码进行签名 

在apk打包过程中gradle也会调用这个命令进行签名,执行签名命令后的详细流程如下:

详细流程

Android V1签名流程

1. MANIFEST.MF 列举了 APK 中的所有文件的消息摘要 (SHA1 or SHA256),消息摘要有三个特性:① 固定长度 ② 唯一性 :不同文件的消息摘要也不同 ③单向性:消息摘要函数是单向函数,只能从原文件得到信息摘要,而无法从摘要中恢复出源文件任何消息

Manifest-Version: 1.0     // 版本号
Built-By: Signflinger       // v1 v2 v3 v4签名代理,它会调用具体的签名工具进行签名
Created-By: Android Gradle 4.1.3

Name: AndroidManifest.xml   // 路径+名称
SHA-256-Digest: Yx92Pkw6ZagIZeFBRj7ExGCC9eAvxgb+9rqvXfH9wGM=  // 消息摘要

Name: assets/images/btn_more.png
SHA-256-Digest: /LZxDmOAT/Y8sdbTVfMqH0gkj9/r8KekZBaK7MUUylg=

Name: classes.dex
SHA-256-Digest: TcUheEODmlXk5DXOi8ReP2WTfKPo6y3tSorFUejcFnA=

Name: lib/arm64-v8a/libmctocurl.so
SHA-256-Digest: +dLvPxlA6vfPonjWVfiInjC+edk+XuRnkoA0qli41RE=
....

2 CERT.SF是对MANIFEST.MF进行消息摘要得到的文件,目的是未MANIFEST.MF的数据完整性和每条数据的安全性增加一层保护错误

Signature-Version: 1.0
Created-By: Android Gradle 4.1.3
SHA-256-Digest-Manifest: lziVu56lWFbtbORoiqPuwVw4eo7GLbKBZPqDpuj9dFU=   //  MANIFEST.MF整体文件做消息摘要得到的值
X-Android-APK-Signed: 2   // meaning this APK was signed with both V1 & V2.

Name: AndroidManifest.xml     // 路径+名称
SHA-256-Digest: c8VhGi4X2S1id++RIlUioNfD/NlTP0amyhaepymlvkg=   // 对MANIFEST.MF对应条目再次进行消息摘要值

3 CERT.RSA
CERT.RSA存储的是:1) CERT.SF 文件用私钥计算出的签名; 2) 包含公钥信息的数字证书.
了解CERT.RSA需要的前置知识如下:
    RSA 是一种非对称加密,公钥公开,私钥保密,加密解密算法是公开的,公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。利用RSA的私钥加密,公钥解密的过程称为“签名”:如果使用公钥能正常解密某一个密文,那么就能证明这段密文一定是由私钥持有者发布的,而不是其他第三方发布的,故此将该过程称为“签名”,这种机制可以保证消息来源的可靠性和不可否认性。

4 为啥不直接对MANIFEST.MF签名,而是加一层CERT.SF?
    答:这是安全性和性能妥协的结果,每增加一层安全性会提升一点,但是在apk安装、打包、甚至运行时候性能会降低,这个是双方妥协的结果。

3.2.2 签名验证

签名验证是发生在APK的安装过程中,流程如下:


签名验证详细流程

    从上图可以看出来v1签名校验就是对比签名的时候写入消息摘要和APK解压后得到所有文件的消息摘要,这个算法保证了除了META-INFO目录下,其他APK解压后的文件未被篡改,但它有明显的问题:实际运行的时候直接使用APK文件,但是它保护的是APK解压后得到的一部分文件,如果APK这个压缩包被篡改,但是解压后的文件依旧包含它保护的部分,那就依旧能通过v1校验,有兴趣的同学可以搜索Janus漏洞,它就是直接通过二进制方式修改APK文件(要搞这个要了解zip文件、app安装、app运行原理等),在头部加入一个class.dex文件,绕过了签名校验,但运行的时候就会先加载头部的class.dex。

3.3 v2签名介绍

    鉴于v1签名的漏洞,谷歌在 Android 7.0 中引入了全新的 APK v2签名方案,v2 签名保护的是除了签名部分以外的整个APK,而不是单个 ZIP 条目,签名后解压缩,重新压缩都会破坏签名导致验签不过,首先我们来看下v2签名的apk什么样子:


v2签名前后apk变化

签名信息块内容

v2签名和验证命令如下

// 签名,apk打包时候自动调用
apksigner sign --ks <keystore-file> --ks-key-alias <alias-name> --out <output-file> <input-file>

// 验证 ,apk安装时候 自动调用 
apksigner verify --print-certs <apk-file>

v2签名和验证过程如下

Android v2签名过程

Android v2签名验证过程

Android v2签名从整体机制上没有明显的漏洞,目前可能有漏洞的点在于签名算法,ZIP文件格式漏洞、以及可能出现的签名验证降级(就是同时使用了v1 v2签名,找到漏洞使得v2签名校验进行不下去降级为V1签名认证)等

V3、V4签名类似于V2签名,略

名词解释

KeyStore:它的作用类似于保险箱,这个保险箱主要用来存储密钥和证书,可以通过账户和密码打开保险,然后通过唯一的Id(别名)来取出来对应的密钥和证书。

签名的未来发展

    未来Android签名机制可能在以下方向发展:

  • 公钥的证书验证:未来可能引入区块链对公钥证书进行管理;
  • 私钥管理:未来私钥的存储、使用可能更加的智能,打通和人生物特征信息的壁垒;
  • 加密算法:随着AI+计算机能力增强,目前的加密算法存在被破解的风险,需要更加安全加密算法。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容