APK签名原理以及方法

1、签名机制

Android系统在安装APK的时候,首先会检查APK的签名,如果发现签名文件不存在或校验签名失败,则会拒绝安装,所以应用程序在发布之前一定要进行签名,给APK签名可以带来以下好处:

① 应用程序升级:如果想无缝升级一个应用,Android系统要求应用程序的新版本与老版本具有相同的签名和包名,若包名相同而签名不同,系统会拒绝安装新版应用;

② 应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进行里运行,此时就可以把我们的应用程序以模块的方式进行部署而用户可以独立的升级其中的一个模块;

③ 代码或数据共享:Android提供了基于签名的权限机制,一个应用可以为另一个以相同证书签名的应用程序公开自己的功能与数据,同时其他具有不同签名的应用程序不可以访问相应的功能与数据;

④ 应用程序的可认定性:签名信息中包含有开发者信息,在一定程度上可以防止应用被伪造;

 

发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的。签名机制在Android应用和框架中有着十分重要的作用。

例如,Android系统禁止更新安装签名不一致的APK;如果应用需要使用system权限,必须保证APK签名与Framework签名一致,等等。在《APK Crack》一文中,我们了解到,要破解一个APK,必然需要重新对APK进行签名。而这个签名,一般情况无法再与APK原先的签名保持一致。(除非APK原作者的私钥泄漏,那已经是另一个层次的软件安全问题了。)

简单地说,签名机制标明了APK的发行机构。因此,站在软件安全的角度,我们就可以通过比对APK的签名情况,判断此APK是否由官方发行,而不是被破解篡改过重新签名打包的盗版软件

 

遍历APK文件中所有文件,对非文件夹、非签名文件逐个生成SHA1的数字签名信息并进行Base64编码,然后把生成的签名写入MANIFEST.MF文件

 

对生成的MANIFEST.MF文件,使用SHA1-RSA算法,使用私钥进行签名来生成CERT.SF文件

(RSA是一种非对称加密算法,使用私钥通过RSA算法对信息进行加密,在安装时只能使用公钥才能解密,解密之后,将它与未加密的信息进行对比,如果相符,则表明内容没有被异常修改)

 

由于生成MANIFEST.MF没有使用任何密钥信息,而生成CERT.SF文件则使用了私钥,

那么我们猜测到CERT.RSA文件中保存了公钥、所采用的加密算法等信息

 

不同私钥签名的APK文件中的公钥是不相同的,所以可以根据公钥的对比来判断私钥是否一致,个人认为主要有以下三种场景:

1、程序自检测。在程序运行时,自我进行签名比对。比对样本可以存放在APK包内,也可存放于云端。缺点是程序被破解时,自检测功能同样可能遭到破坏,使其失效。

2、可信赖的第三方检测。由可信赖的第三方程序负责APK的软件安全问题。对比样本由第三方收集,放在云端。这种方式适用于杀毒安全软件或者 APP Market之类的软件下载市场。缺点是需要联网检测,在无网络情况下无法实现功能。(不可能把大量的签名数据放在移动设备本地)。

3、系统限定安装。这就涉及到改Android系统了。限定仅能安装某些证书的APK。软件发布商需要向系统发布上申请证书。如果发现问题,能追踪到是哪个软件发布商的责任。适用于系统提供商或者终端产品生产商。缺点是过于封闭,不利于系统的开放性。

以上三种场景,虽然各有缺点,但缺点并不是不能克服的。例如,我们可以考虑程序自检测的功能用native method的方法实现等等。软件安全是一个复杂的课题,往往需要多种技术联合使用,才能更好的保障软件不被恶意破坏。

 

4、参考信息

http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.htmlAndroid APK 签名比对

http://www.cnblogs.com/qq78292959/archive/2011/07/25/2116113.htmlAndroid APK签名对比及说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值