其实深入了解Android签名:你必须掌握的核心知识的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享深入了解Android签名:你必须掌握的核心知识的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
Android 要求所有APK 都必须使用证书进行数字签名,然后才能安装到设备上进行更新。
这是一个比较模糊的解释。简单来说,有了签名,应用程序就可以与开发者绑定。
毕竟应用程序太多了,其他开发者也可能窃取你的代码。这时候包名就和你的一样了,代码也和你的一样了。如何区分你的App和这些人的App?
这就是数字签名派上用场的地方。
一、签名基础
要吃透签名知识,必须了解以下知识:
消息摘要、数字签名、加密、数字证书,这一系列的知识你在学习互联网的时候可能或多或少接触过。
感觉好难受,想哭_哭头_表情不舒服。我们先来简单了解一下这些知识:
1. 消息摘要
消息摘要通常称为数字摘要或数字指纹,定义如下:
基于原始数据,经过单向哈希计算,得到一个固定的哈希值,这就是消息摘要。
常见的摘要算法包括MD5、SHA-1和SHA-256,具有以下特点:
长度固定,与内容长度无关:例如MD5为128位,SHA-1为160位,SHA-256为256位。看似随机,其实不随机:相同内容的两次摘要结果一致。单向:只能从原始数据中获取摘要,但不能从报文摘要中获取原始数据。优秀的摘要算法很难 Hash 碰撞基于此,消息摘要通常用于检查内容的完整性。
比如我们下载起点阅读时,消息摘要的使用方式如下:
计算摘要:App会根据自身的文件信息计算出一个数值摘要,如123**.**123 下载App验证摘要:对下载的App再次计算摘要,例如结果也是123 **.* *123,与之前的数字摘要相比,这意味着我从服务器下载的内容完整,可以正常使用。当然,上面的值涉及到总结部分,其他流程稍后再分析。
2. 加密算法
什么是加密?
百科全书是这样解释的:
将明文信息转变为不可读的密文内容,使其不可读的过程。只有具有解密方法的对象才能通过解密过程将密文恢复为正常可读的内容。
因此,通过加密方法得到的密文是可以转化为明文的,而通过MD5等信息摘要算法得到的结果是不可逆的,所以当面试官问你加密算法的时候,你不能提MD5!
加密算法分为两大类,对称加密和非对称加密。
2.1 对称加密
对称加密使用相同的密钥进行加密和解密:
img 图片来自《一文彻底搞懂加密、数字签名和数字证书!》
2.2 非对称加密
非对称加密是利用公钥/私钥中的公钥对明文进行加密,然后利用对应的私钥对密文进行解密的过程:
img 图片来自《一文彻底搞懂加密、数字签名和数字证书!》
我们简单比较一下对称加密和非对称秘密:
非对称加密对称加密时慢时快,效率低,安全性高,低常见算法RSADHAESDESIDEA
2.3 使用场景
研究过网络的同学应该都知道,HTTPS 的传输过程中,客户端而服务器使用非对称加密生成对称加密密钥,然后使用对称加密在网络上传输数据。
比如,我上大学的时候,每个月底我和妈妈的对话是这样的:
会话网络环境是开放的。如果这个时候,有黑客监听了我和妈妈的对话,那么流程就会变成这样:
在监控过程中,当我发卡号的时候,黑客把我的卡号改成了他的,所以我的生活费就变成了他的。
为了避免这种情况的发生,我和妈妈约定,每次发送消息之前都使用对称加密来加密消息,接收消息时使用密钥来解密消息。过程变成了这样:
对称加密中间人无法再获取消息。看起来完全没有问题,但是我和妈妈之间的关键如何确定呢?
密钥必须始终在互联网之间传输。如果有传输,就有被中间人拦截的风险。一旦被截获,钱就没了!
为了解决对称加密密钥传输的问题,我和妈妈采用了非对称加密,像这样:
即便如此,非对称加密仍然存在问题:
如何确认我获得的公钥来自我母亲?我如何确定该消息确实来自我母亲?解决这两个问题也很简单。一是数字签名,二是数字证书。
3. 数字签名
数字签名的作用是为了消息的完整性。
在非对称加密体系下,消息发送过程是这样的,还是上面的例子:
数字签名数字签名的流程如下:
在发送消息之前,我使用哈希算法来获取数据的摘要。我用我妈妈的公钥对摘要内容进行加密,然后将其与对称加密的数据一起发送。我妈妈收到消息后,首先使用对称密钥解密内容。然后Hash计算出摘要后,妈妈用私钥解密摘要内容,并与再次计算出的摘要进行比较。如果它们一致,则意味着消息是正确的。上面的场景其实有点不合适。数字签名通常用在证书上。协商对称性。以后一般不会用密钥来验证消息的完整性,但是大家只需要了解数字签名就是用来验证消息完整性的。
到目前为止,还有最后一个问题。我无法确认获得的公钥确实来自我的母亲。
3. 数字证书
证书的作用很简单,证明公钥的身份。
就像现实中一样,大家如何证明自己的身份呢?
没错,就是身份证。您是否注意到,每张身份证都包含三类信息:
你自己的信息购买身份证的派出所的有效期对应的数字证书也包含很多内容:
CA:证书的颁发机构、证书的有效期、公钥证书的授予对象,CA用CA的私钥对这些内容进行签名,用户使用CA的公钥验证签名,从而证明公钥的身份。
常见的证书有两种类型:
签名证书:由CA颁发,大多数网站都采用这种方式。自签名证书:由服务器自己颁发。回到前面的例子,妈妈只需要把她自己签名的证书发给我,我就可以拿到她的公钥,然后就可以正常通信了。
二、Android签名机制
在Android中,数字签名还需要数字证书。数字证书中的公钥对应的私钥由开发者持有。
关于如何生成私钥和证书,可以查看:
《Android官方文档》
在Android Studio中,最终会生成一个.jks文件。在早期的Eclipse 中,它是.keystore。它们是用作证书和私钥的二进制文件。
如果应用程序使用一个私钥签名,则使用另一个私钥签名的文件将无法安装或覆盖旧版本。这是为了防止已安装的应用程序被恶意第三方覆盖。
1. Android签名机制的异同点
Android中数字签名的生成与普通数字签名没有太大区别。
但是,用于数字签名的证书可以是自签名证书,即不需要权威证书颁发机构(CA)进行背书,因为它的作用是识别应用程序的开发者,而下载用户并不需要授权。需要这个证书才能下载。该应用程序。
2. Debug和Relase的签名
当我们在IDE中运行或调试项目时,AS会自动使用Android SDK工具生成的调试证书来签署我们的应用程序。路径为$HOME/.android/debug.keystore,但应用商店不接受调试使用。证书颁发的应用程序签名。
在打包Release时,我们通常会在app模块中的build.gradle中进行配置:
安卓{
.
签名配置{
发布{
storeFile 文件("release.keystore")
存储密码"******"
keyAlias "******"
密钥密码"******"
}
}
}这些是我们生成.jks 或.keystore 所需的参数。
三、签名方案
目前,Android支持以下四种应用程序签名方案:
v1 方案:基于JAR 签名v2 方案:Android 7.0 引入,有较大改动v3 方案:Android 9.0 引入,基于v2 升级v4 方案:Android 11.0 引入,用于支持ADB 增量APK 安装
1 v1方案
v1 为陈词滥调的签名是的,签名过程也很简单。
如果我们选择任何签名的apk来解压,我们会发现一个META-INF文件。该文件通常包含以MF、SF、RSA结尾的文件,如图:
image-20220615223157929这些文件在v1 签名过程中如下所示:
v1进程验证过程是在Apk安装过程中:
v1验证的整个流程清晰明了,但是v1有两个问题:
第一个问题是签名验证速度慢。 Apk中的所有文件都必须经过验证,这会减慢旧设备的安装时间。
第二个问题是仅验证ZIP 条目,META-INF 文件不计入验证过程。这会导致即使我的Apk已经签名,工程师也可以移动条目的顺序并重新压缩它,或者修改META-INF文件下的内容,从而带来一些安全风险。早期的多渠道包装就写到这里了。
2. v2方案
v2是Android签名方案向前迈出的一大步,解决了v1留下的签名验证缓慢和完整性问题。
我们先看一下v2的组成部分:
APKv1签名前后的组件实际上与签名前相同。 v2 多了一个红色区域,我们称之为APK 签名块。
从每个签名APK部分的受保护内容来看,v1只保护内容1,v2的受保护区域包括1、3、4、2的签名数据区域。签名数据是从1导出的摘要等信息、 3 和4。
签名过程
对于一个App来说,它可能有一个或多个签名者,对于每个签名者,都会执行签名过程。
v2 不是针对每个文件进行计算,而是针对所有字节进行计算。它将区域1、3 和4 分割为每个1MB 的连续块,计算如下:
每个chunk 的计算方式为:字节0xa5 + chunk 字节长度+ chunk 内容。每个块1、3 和4 的计算方式为:字节0xa5 + 块数+ 块摘要。最后,将这些一个或多个签名作为作者的摘要、证书等信息打包到Apk中。
v2流程
验签过程
v2方案的APK验证流程如下:
每次在APK签名块区域中找到签名者时,都会对其进行验证:签名算法、信息摘要、证书和公钥。所有签名者均已通过验证,APK验证将通过。
3. v3方案
v3 解决方案基于v2。目标是解决更新过程中更改签名密钥的问题。
因此APK签名块中添加了两部分:
Proof-of-rotation: 所有替换的旧签名证书的链接列表。根节点是最旧的证书。 SDK版本支持v3和v2。签名过程和验证过程几乎是一样的,就不写出来了。
4. v4方案
如果同学经常玩一些主机游戏,可以发现在PS5或者Switch上,即使没有安装一些游戏,我们仍然可以打开游戏玩一些基本的功能,比如我以前玩的NBA 2k系列玩。
谷歌还在Android 11中添加了ADB增量APK安装功能。例如,一个APK有2GB。下载50 MB 后,我可以使用一些基本功能,其余文件在后台传输。不过,Android 11中这个功能是For ADB的。
虽然这个特性很棒,但是它给签名方案带来了一些挑战。之前的方案都是基于所有文件进行验证的,因此推出了Android第四代签名方案v4。
v4根据APK的所有字节计算Merkle Hash树,并使用Merkle树的根哈希和salt值作为包完整性验证的签名数据。 v4签名必须单独存在于.idsig文件中,并且不会存在于APK文件中。所以apk文件中仍然需要v2或v3签名。
5. 向下兼容的签名方案
Android中的签名方案是从上到下兼容的,如图:
APK验证流程v4 对于Android 11,验证流程如下:
支持v4吗? v4验证完毕后,再次验证v3,否则v2v4失败。 v3v3验证失败。 v2v2验证失败。 v1v1验证失败。安装失败。对于Android 9,您必须从v3解决方案开始验证。
总结
看完这篇文章,相信你对Android签名方案有了基本的了解。
如果文章有什么不对的地方,请在评论区找我~
参考文章:
《Android v1、v2、v3签名详解》
《增量安装与安卓V4签名简介》
【深入了解Android签名:你必须掌握的核心知识】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直想了解一下Android签名的具体操作流程。
有14位网友表示赞同!
刚开始接触开发,能详细解释Android签名吗?
有14位网友表示赞同!
学习安卓开发需要知道哪些基本的签名方法?
有18位网友表示赞同!
为什么Android app 需要签名?
有17位网友表示赞同!
分享一下不同App签名的区别吗?
有11位网友表示赞同!
签名验证真的这么重要吗?
有18位网友表示赞同!
想了解下证书的续费和管理过程。
有19位网友表示赞同!
有推荐用什么工具来进行Android签名操作吗?
有15位网友表示赞同!
遇到过app 无法安装的情况,是因为签名不匹配吗?
有19位网友表示赞同!
学习了一些安卓基础知识,现在开始想要深入了解签名相关的内容。
有9位网友表示赞同!
想了解一下签名的安全机制和作用。
有15位网友表示赞同!
听说Android签名可以防止应用篡改,是真的吗?
有16位网友表示赞同!
在网上看到很多关于签名破解的文章,感觉很困惑...
有17位网友表示赞同!
学习安卓开发的时候总是会遇到签名相关的难题。
有19位网友表示赞同!
希望能详细讲解Android证书的生成和使用流程。
有8位网友表示赞同!
想了解一下签名的未来发展趋势。
有18位网友表示赞同!
分享一些关于Android签名的一些最佳实践吗?
有11位网友表示赞同!
对新手来说,学习Android签名需要用到哪些资源?
有18位网友表示赞同!
Android签名与App商店审核有什么关系?
有20位网友表示赞同!