APK 签名详解

APK 签名详解1.签名的意义  为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的PackageName来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性。2.签名对你的App的影响。   你不可能只做一个APP,你可能有一个宏伟的战略工程,想要在生活,服务,游戏,系统各个领域都想插足的话,你不可能只做一个APP,谷歌建议你把你所有的

大家好,又见面了,我是你们的朋友全栈君。

1.签名的意义
  为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性。

2.签名对你的App的影响。
   你不可能只做一个APP,你可能有一个宏伟的战略工程,想要在生活,服务,游戏,系统各个领域都想插足的话,你不可能只做一个APP,谷歌建议你把你所有的APP都使用同一个签名证书。
   使用你自己的同一个签名证书,就没有人能够覆盖你的应用程序,即使包名相同,所以影响有:
  1) App升级。 使用相同签名的升级软件可以正常覆盖老版本的软件,否则系统比较发现新版本的签名证书和老版本的签名证书不一致,不会允许新版本安装成功的。
  2) App模块化android系统允许具有相同签名的App运行在同一个进程中,如果运行在同一个进程中,则他们相当于同一个App,但是你可以单独对他们升级更新,这是一种App级别的模块化思路。
  3) 允许代码和数据共享android中提供了一个基于签名的Permission标签。通过允许的设置,我们可以实现对不同App之间的访问和共享,如下:

AndroidManifest.xml<permissionandroid:protectionLevel="normal" />

其中protectionLevel标签有4种值:normal(缺省),dangerous, signature,signatureOrSystem。简单来说,normal是低风险的,所有的App不能访问和共享Appdangerous是高风险的,所有的App都能访问和共享此Appsignature是指具有相同签名的App可以访问和共享此AppsignatureOrSystem是指系统imageApp和具有相同签名的App可以访问和共享此App,谷歌建议不要使用这个选项,因为签名就足够了,一般这个许可会被用在在一个image中需要共享一些特定的功能的情况下。
  最后,请一定要记得保管好你的签名证书的两个密码,两个密码都不要告诉任何人,也不要把你的密钥库拷贝给别人,包括我! 

3.签名。
1)签名文件认知:

我们已经知道的是:Android对每一个Apk文件都会进行签名,在Apk文件安装时,系统会对其签名信息进行比对,判断程序的完整性,从而决定该Apk文件是否可以安装,在一定程度上达到安全的目的。

给定一个Apk文件,解压,可以看到一个META-INFO文件夹,在该文件夹下有三个文件:分别为MANIFEST.MFCERT.SFCERT.RSA。这三个文件分别表征以下含义:

1MANIFEST.MF:这是摘要文件。程序遍历Apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个用SHA1(安全哈希算法)生成摘要信息,再用Base64进行编码。如果你改变了apk包中的文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFEST.MF的检验信息不同,于是程序就不能成功安装。

说明:如果攻击者修改了程序的内容,有重新生成了新的摘要,那么就可以通过验证,所以这是一个非常简单的验证。

2CERT.SF:这是对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。

说明:在这一步,即使开发者修改了程序内容,并生成了新的摘要文件,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件(CERT.SF)。系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件(MANIFEST.MF)对应不起来,所以不能通过检验,不能成功安装文件。

3CERT.RSA文件中保存了公钥、所采用的加密算法等信息。

说明:系统对签名文件进行解密,所需要的公钥就是从这个文件里取出来的。

结论:从上面的总结可以看出,META-INFO里面的说那个文件环环相扣,从而保证Android程序的安全性。(只是防止开发者的程序不被攻击者修改,如果开发者的公私钥对对攻击者得到或者开发者开发出攻击程序,Android系统都无法检测出来。)

2)二次签名:
 于某些限制,会有这样的需求:拿不到apk源码的情况下要对其中的一些资源进行修改,在Android签名的限制下,直接解压修改会导致签名不一致,这样的apk文件在手机上是无法被安装的,这样就只能对apk进行重新签名来生成新的apk包。从另外一个角度上来说,这也是从系统的级别来保证安全:一个被特定私钥签名的apk是无法被篡改且无法抵赖的。  要对apk进行重新签名,首先要生成自己的公私钥对,然后删除apk中原有的签名信息再对apk进行重新签名。通过解压可知,apk的签名信息全都存在于META-INF中,删除这个文件,原apk就变成了一个未签名的apk 
3)如何签名
	根据不同环境或命令或工具进行签名,详细内容baidu/sogou
4.验证签名。
	判断一个APK是否是盗版:
1)软件自身判定:判断当前应用签名和最初是否一致
2)第三方判定:如豌豆荚等应用如何判定其他软件是否是官方出品?将商店里的App与官网上的App签名做对比。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135447.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 135首经典欧美歌曲 —附下载地址

    135首经典欧美歌曲 —附下载地址135首经典欧美歌曲—附下载地址(2011-03-1212:52:14)转载▼标签:杂谈分类:转载精选源自张海峡新浪博客:http://blog.sina.com.cn/zhanghaixiaf

  • 自建电驴服务器,电驴服务器怎么连接 eMule连接服务器教程

    自建电驴服务器,电驴服务器怎么连接 eMule连接服务器教程电驴(eMule)是一款非常实用的资源下载工具。但有时候用户会反映,电驴连接不到服务器的情况,今天小编就跟大家讲讲电驴服务器怎么连接,让你轻松下载到自己需要的资源。eMule连接服务器教程步骤一:在电驴服务器界面右边的“从URL更新server.met”字样下边的小框里输入“”,然后点击“更新”,下载新的服务器列表即可(使用的网址不要emule.org.cn提供的)步骤二:解决kad网络无法连接1…

  • Android中Broadcast Receiver组件具体解释

    Android中Broadcast Receiver组件具体解释

    2021年12月15日
  • 惠普打印机驱动安装出现严重错误_惠普 服务器

    惠普打印机驱动安装出现严重错误_惠普 服务器现在很多用户已经升级了win10正式版,但是也遇到了不少问题。默认情况下,Windows10系统会自动安装电脑设备的驱动,其中就包括打印机的。但是近日有些朋友反馈在更新HP打印机时,遇到错误提示“HPdriverupdateforHPLaserJetM1530MFPSeriesPCL6-错误0x80240017”,且会不停自动安装,而安装总是失败,这该怎么办呢?下面就详情…

  • Marlin2.0.9 Configuration_adv.h详解

    Marlin2.0.9 Configuration_adv.h详解/**Marlin3DPrinterFirmwareCopyright©2020MarlinFirmware[https://github.com/MarlinFirmware/Marlin]BasedonSprinterandgrbl.Copyright©2011CamielGubbels/ErikvanderZalmThisprogramisfreesoftware:youcanredistributeitand/ormodif

  • mysql字段默认值使用null还空字符串_mysql分割字符串split

    mysql字段默认值使用null还空字符串_mysql分割字符串split#字符串拼接concat(s1,s2);将表中last_name和first_name中的字符串拼接selectconcat(last_name,first_name)as姓名fromemployees;#只会修改last_name不会修改first_nameSELECTfirst_name,last_nameASfFROMemployees;#将两个列用逗号隔开并命名为o…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号