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

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

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

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

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

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

2.1 身份验证

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

2.2 数据完整性保护

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

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

3.1 Android签名有哪些

3.1.1 查看apk签名

java 复制代码
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中增加以下配置:

java 复制代码
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 签名过程

签名命令

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

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

详细流程

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

java 复制代码
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的数据完整性和每条数据的安全性增加一层保护错误

makefile 复制代码
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签名和验证命令如下

scss 复制代码
// 签名,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老皮!!!欢迎大家来找我探讨交流👀

相关推荐
技术摆渡人1 小时前
Android 系统技术探索(3)光影魔术(SurfaceFlinger & 图形栈)。
android
某空m2 小时前
【Android】浅析DataBinding
android·开发语言
sky北城3 小时前
You are not able to choose some of the languages, because locales for them a
android
儿歌八万首3 小时前
Jetpack Compose 实战:打造高性能轮播图 (Carousel) 组件
android·前端·kotlin
QING6183 小时前
Kotlin Flow 防抖(Debounce)详解
android·kotlin·android jetpack
QING6183 小时前
Kotlin Flow 防抖(Debounce)、节流(Throttle)、去重(distinctUntilChanged) —— 新手指南
android·kotlin·android jetpack
AI视觉网奇3 小时前
android yolo12 android 实战笔记
android·笔记·yolo
海上飞猪4 小时前
【Mysql】Mysql的安装部署和使用
android·mysql·adb
我是好小孩4 小时前
【Android】项目的组件化搭建
android
aqi004 小时前
FFmpeg开发笔记(九十四)基于Kotlin的国产开源推拉流框架anyRTC
android·ffmpeg·kotlin·音视频·直播·流媒体