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

在日常日子中,签名是咱们标明身份和授权的一种方法,无论是手写签名仍是电子签名,它们都承载着签名者对某个文件内容的承认或对某个事情的授权,签名一般具有以下特征:

  • 独特性 一个签名能够承认仅有的签名主体;
  • 可验证 能够经过签名区分签名者的身份,这要求签名具有可识别才能和防伪才能;
  • 主体别离 签名作为标明签名者身份的一个事物,不是签名者的一部分,能够独立传递转移;

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也会调用这个指令进行签名,履行签名指令后的具体流程如下:

具体流程

谈谈签名的基本特征、效果、原理、流程和未来开展掘

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打包时候自动调用
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签名从整体机制上没有显着的缝隙,现在或许有缝隙的点在于签名算法,ZIP文件格式缝隙、以及或许出现的签名验证降级(便是同时运用了v1 v2签名,找到缝隙使得v2签名校验进行不下去降级为V1签名认证)等

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

名词解释

**KeyStore:**它的效果类似于稳妥箱,这个稳妥箱首要用来存储密钥和证书,能够经过账户和暗码翻开稳妥,然后经过仅有的Id(别号)来取出来对应的密钥和证书。

签名的未来开展

未来Android签名机制或许在以下方向开展:
  • 公钥的证书验证:未来或许引入区块链对公钥证书进行办理;

  • 私钥办理:未来私钥的存储、运用或许愈加的智能,打通和人生物特征信息的壁垒;

  • 加密算法:随着AI+计算机才能增强,现在的加密算法存在被破解的风险,需求愈加安全加密算法。

重视大众号:Android老皮!!!欢迎大家来找我讨论交流