
Android V1及V2签名原理简析
Android为了保证系统及应用的安全性,在安装APK的时候需要校验包的完整性,同时,对于覆盖安装的场景还要校验新旧是否匹配,这两者都是通过Android签名机制来进行保证的,本文就简单看下Android的签名与校验原理,分一下几个部分分析下: 签名是摘要与非对称密钥加密相相结合的产物,摘要就像内容的一个指纹信息,一旦内容被篡改,摘要就会改变,签名是摘要的加密结果,摘要改变,签名也会失效。Android APK签名也是这个道理,如果APK签名跟内容对应不起来,Android系统就认为APK内容被篡改了,从而拒绝安装,以保证系统的安全性。目前Android有三种签名V1、V2(N)、V3(P),本文只看前两种V1跟V2,对于V3的轮密先不考虑。先看下只有V1签名后APK的样式: 再看下只有V2签名的APK包样式: 同时具有V1 V2签名: 可以看到,如果只有V2签名,那么APK包内容几乎是没有改动的,META_INF中不会有新增文件,按Google官方文档:在使用v2签名方案进行签名时,会在APK文件中插入一个APK签名分块,该分块位于zip中央目录部分之前并紧邻该部分。在APK签名分块内, 签名和签名者身份信息会存储在APK签名方案v2分块中,保证整个APK文件不可修改 ,如下图: 而V1签名是通过META-INF中的三个文件保证签名及信息的完整性: V1签名是如何保证信息的完整性呢?V1签名主要包含三部分内容,如果狭义上说签名跟公钥的话,仅仅在.rsa文件中,V1签名的三个文件其实是一套机制,不能单单拿一个来说事, 如果对APK中的资源文件进行了替换,那么该资源的摘要必定发生改变,如果没有修改MANIFEST.MF中的信息,那么在安装时候V1校验就会失败,无法安装,不过如果篡改文件的同时,也修改其MANIFEST.MF中的摘要值,那么MANIFEST.MF校验就可以绕过。 CERT.SF个人觉得有点像冗余,更像对文件完整性的二次保证,同绕过MANIFEST.MF一样,.SF校验也很容易被绕过。 CERT.RSA与CERT.SF是相互对应的,两者名字前缀必须一致,不知道算不算一个无聊的标准。看下CERT.RSA文件内容: CERT.RSA文件里面存储了证书公钥、过期日期、发行人、加密算法等信息,根据公钥及加密算法,Android系统就能计算出CERT.SF的摘要信息,其严格的格式如下: 从CERT.RSA中,我们能获的证书的指纹信息,在微信分享、第三方SDK申请的时候经常用到,其实就是公钥+开发者信息的一个签名: 除了CERT.RSA文件,其余两个签名文件其实跟keystore没什么关系,主要是文件自身的摘要及二次摘要,用不同的keystore进行签名,生成的MANIFEST.MF与CERT.SF都是一样的,不同的只有CERT.RSA签名文件。也就是说前两者主要保证各个文件的完整性,CERT.RSA从整体上保证APK的来源及完整性,不过META_INF中的文件不在校验范围中,这也是V1的一个缺点。V2签名又是如何保证信息的完整性呢? 前面说过V1签名中文件的完整性很容易被绕过,可以理解 单个文件完整性校验的意义并不是很大 ,安装的时候反而耗时,不如采用更加简单的便捷的校验方式。V2签名就不针对单个文件校验了,而是 针对APK进行校验 ,将APK分成1M的块,对每个块计算值摘要,之后针对所有摘要进行摘要,再利用摘要进行签名。 也就是说,V2摘要签名分两级,第一级是对APK文件的1、3 、4 部分进行摘要,第二级是对第一级的摘要集合进行摘要,然后利用秘钥进行签名。安装的时候,块摘要可以并行处理,这样可以提高校验速度。 APK是先摘要,再签名,先看下摘要的定义:Message Digest:摘要是对消息数据执行一个单向Hash,从而生成一个固定长度的Hash值,这个值就是消息摘要,至于常听到的MD5、SHA1都是摘要算法的一种。理论上说,摘要一定会有碰撞,但只要保证有限长度内碰撞率很低就可以,这样就能利用摘要来保证消息的完整性,只要消息被篡改,摘要一定会发生改变。但是,如果消息跟摘要同时被修改,那就无从得知了。 而数字签名是什么呢(公钥数字签名),利用非对称加密技术,通过私钥对摘要进行加密,产生一个字符串,这个字符串+公钥证书就可以看做消息的数字签名,如RSA就是常用的非对称加密算法。在没有私钥的前提下,非对称加密算法能确保别人无法伪造签名,因此数字签名也是对发送者信息真实性的一个有效证明。不过由于Android的keystore证书是自签名的,没有第三方权威机构认证,用户可以自行生成keystore,Android签名方案无法保证APK不被二次签名。 知道了摘要跟签名的概念后,再来看看Android的签名文件怎么来的?如何影响原来APK包?通过sdk中的apksign来对一个APK进行签名的命令如下: 其主要实现在 android/platform/tools/apksig 文件夹中,主体是ApkSigner.java的sign函数,函数比较长,分几步分析 先来看这一步,ApkUtils.findZipSections,这个函数主要是解析APK文件,获得ZIP格式的一些简单信息,并返回一个ZipSections, ZipSections包含了ZIP文件格式的一些信息,比如中央目录信息、中央目录结尾信息等,对比到zip文件格式如下: 获取到 ZipSections之后,就可以进一步解析APK这个ZIP包,继续走后面的签名流程, 可以看到先进行了一个V2签名的检验,这里是用来签名,为什么先检验了一次?第一次签名的时候会直接走这个异常逻辑分支,重复签名的时候才能获到取之前的V2签名,怀疑这里获取V2签名的目的应该是为了排除V2签名,并获取V2签名以外的数据块,因为签名本身不能被算入到签名中,之后会解析中央目录区,构建一个DefaultApkSignerEngine用于签名 先解析中央目录区,获取AndroidManifest文件,获取minSdkVersion(影响签名算法),并构建DefaultApkSignerEngine,默认情况下V1 V2签名都是打开的。 第五步与第六步的主要工作是:apk的预处理,包括目录的一些排序之类的工作,应该是为了更高效处理签名,预处理结束后,就开始签名流程,首先做的是V1签名(默认存在,除非主动关闭): 步骤7、8、9都可以看做是V1签名的处理逻辑,主要在V1SchemeSigner中处理,其中包括创建META-INFO文件夹下的一些签名文件,更新中央目录、更新中央目录结尾等,流程不复杂,不在赘述,简单流程就是: 这里特殊提一下重复签名的问题: 对一个已经V1签名的APK再次V1签名不会有任何问题 ,原理就是:再次签名的时候,会排除之前的签名文件。 可以看到目录、META-INF文件夹下的文件、sf、rsa等结尾的文件都不会被V1签名进行处理,所以这里不用担心多次签名的问题。接下来就是处理V2签名。 V2SchemeSigner处理V2签名,逻辑比较清晰,直接对V1签名过的APK进行分块摘要,再集合签名,V2签名不会改变之前V1签名后的任何信息,签名后,在中央目录前添加V2签名块,并更新中央目录结尾信息,因为V2签名后,中央目录的偏移会再次改变: 签名校验的过程可以看做签名的逆向,只不过覆盖安装可能还要校验公钥及证书信息一致,否则覆盖安装会失败。签名校验的入口在PackageManagerService的install里,安装官方文档,7.0以上的手机优先检测V2签名,如果V2签名不存在,再校验V1签名,对于7.0以下的手机,不存在V2签名校验机制,只会校验V1,所以,如果你的App的miniSdkVersion<24(N),那么你的签名方式必须内含V1签名: 校验流程就是签名的逆向,了解签名流程即可,本文不求甚解,有兴趣自己去分析,只是额外提下覆盖安装,覆盖安装除了检验APK自己的完整性以外,还要校验证书是否一致只有证书一致(同一个keystore签名),才有可能覆盖升级。覆盖安装同全新安装相比较多了几个校验 这里只关心证书部分: Android V1及V2签名签名原理简析 仅供参考,欢迎指正
如何对Android的APP进行签名
1、在Android Studio中打开工程,点击“Build”菜单下的“Generate Signed APK”。 2、在“Key store path”中输入签名文件路径,输入密码,点击“Next”。如果你没有签名文件,请点击以下链接先生成一个签名文件。 3、修改存放apk文件的路径,并确认界面上的信息都准确无误后,点击“Finish”。 4、稍等片刻,在如下的窗口中可以签名是否成功的消息。如果工程没有错误,就会自动生成带签名的apk。点击最下面的“Show in Explorer”。 5、这时就会打开Event Log 窗口,点击窗口最后的“Show in Explorer”。 6、现在就会自动跳转到以签名的apk所在路径啦。至此,你就可以在各大应用市场发布这个已签名app啦。
Android签名有什么作用
Android签名有什么作用 最简单直接的回答: 系统要求的。 Android系统要求每一个Android应用程式必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程式没有经过数字签名,是没有办法安装到系统中的! Android通过数字签名来标识应用程式的作者和在应用程式之间建立信任关系,不是用来决定终端使用者可以安装哪些应用程式。 这个数字签名由应用程式的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程式包自我认证的。 平时我们的程式可以在模拟器上安装并执行,是因为在应用程式开发期间,由于是以Debug面试进行编译的,因此ADT根据会自动用预设的金钥和证书来进行签名,而在以释出模式编译时,apk档案就不会得到自动签名,这样就需要进行手工签名。给apk签名可以带来以下好处:1.、应用程序升级:如果你希望使用者无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程式。如果你采用了不同的证书,那么系统会要求你的应用程式采用不同的包名称,在这种情况下相当于安装了一个全新的应用程式。如果想升级应用程式,签名证书要相同,包名称要相同!2、应用程式模组化:Android系统可以允许同一个证书签名的多个应用程式在一个程序里执行,系统实际把他们作为一个单个的应用程式,此时就可以把我们的应用程式以模组的方式进行部署,而使用者可以独立的升级其中的一个模组3、程式码或者资料共享:Android提供了基于签名的许可权机制,那么一个应用程式就可以为另一个以相同证书签名的应用程式公开自己的功能。以同一个证书对多个应用程式进行签名,利用基于签名的许可权检查,你就可以在应用程式间以安全的方式共享程式码和资料了。不同的应用程式之间,想共享资料,或者共享程式码,那么要让他们执行在同一个程序中,而且要让他们用相同的证书签名。 word 电子签名有什么作用? 对文件进行数字签名与签署纸质文件的原因大致相同。数字签名通过使用计算机加密来验证 (身份验证:验证人员和产品所宣告的身份是否属实的过程。例如,通过验证用于签名程式码的数字签名来确认软体发行商的程式码来源和完整性。)数字资讯,如文件、电子邮件和巨集。数字签名有助于确保: 真实性 数字签名有助于确保签署人的身份与宣告的相符。 完整性 数字签名有助于确保内容在经过数字签名之后未经更改或篡改。 不可否认 数字签名有助于向所有方证明签署内容的有效性。“否认”指签名人否认任何与签署内容有关系的行为。 为了确保以上各项,必须由内容建立者使用满足下列条件的签名对内容进行数字签名: 该数字签名有效 (有效:一种证书状态,根据证书颁发机构的资料库对证书进行检查后发现它是合法的、最新的,而且没有过期或被吊销。由有效证书签名且签名后没有更改的文件被视为有效文件。)。 与该数字签名关联的证书 (证书:一种证明身份和真实性的数字方法。证书由证书颁发机构颁发,而且和驾驶执照一样,也可能过期或被吊销。)有效(没有过期)。 作为释出者的签名人或公司可信 (信任:表示您是否信任证书颁发的受体(个人或组)。预设设定是“继承颁发者的信任关系”,也就是因为对颁发者(通常是证书颁发机构)的信任而信任证书。)。 与数字签名关联的证书由有声望的证书颁发机构 (CA) (证书颁发机构 (CA):一个商业组织,它颁发数字证书,跟踪被颁发证书的人员,对证书签名以验证其有效性,并跟踪被吊销或已过期的证书。) 颁发给签名释出者。 信用卡签名有什么作用 相当于合同 纠纷时有依据 平常是没什么拉 手机软体签名有什么作用 目前有实力的公司或确实有需要的公司会购买诺基亚的高阶权 限证书,通常是安全厂商.这类公司的软体不需要我们自签名,还有许多 软体都是一般的应用软体,和系统没什么关联,它们许可权很低,不可能存 在危险,比如网路电视软体,阅读软体,QQ,主题等都不需要签名.需要签 名的软体软体大致可分为以下几种情况:(1)随开机启动的,比如来电 通,A4自签名版;(2)不要你操作可以自动执行的,比如屏保程式;(3)进入 系统资料夹修改的,比如大部分后期汉化的软体等,再次安装汉化补丁 时就需要签名. 可靠的电子签名有什么作用? 依据《中华人民共和国电子签名法》第十四条:“可靠的电子签名与手写签名或者盖章具有同等的法律效力。”由此可见,只有使用“可靠的电子签名”,电子合同才有可能具有与纸质合同同等的法律效力,即书证效力。 C#工程档案签名有什么作用 主要是防止篡改破解。比如你写的程式包括1个exe和若干dll,exe花费了很多工作量,而且上面有你们公司的标识。现在来了个黑客,反编译了某个dll,发现很轻易就改动了里面某个dll,比如注册码的dll,导致绕开了验证码。再来个黑客,把干好事的dll改成了删掉所有磁碟上档案的功能,导致使用者把你公司拉进黑名单。 如果签了名,就可以保证exe只能呼叫你自己写的dll,他们篡改了你的dll,exe会报错,报找不到dll。 驱动程式签名有什么作用啊? 可以确认驱动程式与Windows 无相容性问题(不过不代表没有签名的驱动就一定不相容Windows) 新年快乐 android签名工具干什么用的 给apk签名用的。但是你要有key,或者自己用eclipse生成一个。签名有一个很重要作用就是防止程式释出后被篡改签名一般用私钥,私钥签名以后会生成harsh值序列,公钥验证的时候(手机上),会根据档案内容再生成一次harsh序列,如果和apk中的harsh序列相同,说明apk释出后没有被篡改过 禁止驱动程式强制签名有什么作用 没有坏处。 驱动程式签名又叫做驱动程式的数字签名,它是由微软的Windows硬体装置质量实验室完成的。硬体开发商将自己的硬体装置和相应的驱动程式交给该实验室,由实验室对其进行测试,测试合格后实验室将在其驱动程式中新增数字签名。由于数字签名是由微软完成的。 使用有数字签名的驱动程式将的好处: 安全保障 由于数字签名是针对整个驱动程式的所有软体进行的,所以在完成签名后再对驱动程式进行任何更改都会导致签名无效,这样就避免了在驱动程式中新增恶意程式码传播病毒等恶意程式的可能性。
用androidstudio怎么创建签名
对apk的签名需要把项目导入到Android studio软件中,进行点击菜单中“Build”选项,弹出的下拉菜单中的“generate signed APK”. 进入到generate signed apk中界面框中,因第一次对apk的签名,就需要先创建签名文件钥匙,点击”create new“的按钮。 进行选择钥匙保存的位置,指定到磁盘的位置,然后在文件昵称填入,点击“ok”的选项。 进入到new key store的界面中,根据界面中提示信息输入内容信息,输入完成之后点击“ok”。 钥匙创建完成之后,进行点击"next下一步"操作。 在进入到这个界面中选择apk生成保存的位置,然后在build type中选择release的选项,然后点击“Finish”的选项,这样就生成到apk的保存路径中。
android studio 怎么给apk签名
1 第一步我们打开我们下载安装好的Android Studio 2 然后我们选择好了我们的要发布的项目选择Build 3 然后选择Generate Signed APK 4 然后可以选择创建或者选择一个已有的key,我这里选择以前创建好的一个key文件 5 然后输入密码等信息,点击next 6 然后点击finish,选择release版本 7 我们就可以看到生成的apk文件了,然后我们就可以把应用发布到各平台供人下载了