吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17746|回复: 3
收起左侧

[Android 分享] Android 签名机制:Key的产生方法和签名原理

[复制链接]
王旭东 发表于 2015-1-8 10:46
apk签名作用:
  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个 permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应 用程序才能取得该权限。Android使用Java的数字证书相关的机制来 给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制。Android系统要求每一个安装进系 统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信 任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的;也是用来判断该应用是否被别人破解,二次打包的一个标准,但是签名并不能防止被破解。
Android数字证书包含以下几个要点
(1)所有的应用程序都必须有数字证书 ,Android系统不会安装一个没有数字证书的应用程序;
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证;
(3)如果要正式发布 一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名 ,而不能使用adt插件 或者ant工具 生成的调试证书来发布。
(4)数字证书都是有有效期 的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
(5)Android使用标准的java工具 Keytool and Jarsigner 来生成数字证书,并给应用程序包签名。
(6)使用zipalign 优化 程序。
签名原理
       Android系统签名主要有ROM签名和应用程序APK签名两种形式。ROM签名是针对已经生成的Android系统ROM包进行签名。应用程序APK签名是针对开发者开发的应用程序安装包APK进行签名。前者是对整个Android系统包签名,后者只对Android系统中一个应用程序APK签名。
Android 应用程序APK是jar包,签名采用的工具是signapk.jar包,对应用程序安装包签名的执行命令如下:
java -jar signapk.jar publickey privatekey input.apk output.apk
此命令实现了对应用程序安装包input.apk签名的功能。在signapk.jar命令中,第一个参数为公钥publickey,第二个参数为私钥privatekey,第三个参数为输入的包名,第四个参数签名后生成的输出包名。在此命令中,signapk.jar使用公钥publickey和私钥privatekey对input.apk安装包进行签名,生成output.apk包。signapk源码位于build/tools/signapk/SignApk.java中。
  完成签名后APK包中多了一个META-INF文件夹,其中有名为MANIFEST.MF、CERT.SF和CERT.RSA的三个文件。MANIFEST.MF文件中包含很多APK包信息,如manifest文件版本、签名版本、应用程序相关属性、签名相关属性等。CERT.SF是明文的签名证书,通过采用私钥进行签名得到。CERT.RSA是密文的签名证书,通过公钥生成的。MANIFEST.MF、CERT.SF和CERT.RSA三个文件所使用的公钥和私钥的生成可以通过development/tools/make_key 来获得。下面分别介绍MANIFEST.MF、CERT.SF和CERT.RSA三个文件的生成方法。
1)生成MANIFEST.MF文件
生成MANIFEST.MF是对APK包中所有未签名文件逐个用算法SHA1进行数字签名,再对数字签名信息采用Base64进行编码,最后将编完码的签名写入MANIFEST.MF文件中。添加数字签名到manifest文件通过调用addDigestsToManifest方法实现,具体代码如下:
(简言之:MANIFESt.MF 文件中的内容就是通过遍历apk中所有文件(entry),逐一生成SHA-1数字签名,然后通过Base64编码转码)
1.  private static Manifest addDigestsToManifest(JarFile jar)
2.  {  
3.   ……  
4.   //遍历update.apk包中所有文件  
5.   //得到签名文件内容  
6.   InputStream data = jar.getInputStream(entry);  
7.   
8.   //更新文件内容  
9.   while ((num = data.read(buffer)) > 0) {  
10.   md.update(buffer, 0, num);
11.  }  
12.  ……  
13.     //进行SHA1签名,并采用Base64进行编码  
14.  attr.putValue("SHA1-Digest", base64.encode(md.digest()));
15.  output.getEntries().put(name, attr);
16.  ……  
17. }  
需要说明,生成MANIFEST.MF使用了SHA1算法进行数字签名,SHA1是一种Hash算法,两个不同的信息经Hash运算后不会产生同样的信息摘要,由于SHA1是单向的,所以不可能从消息摘要中复原原文。如果恶意程序改变了APK包中的文件,那么在进行APK安装校验时,改变后的摘要信息与MANIFEST.MF的检验信息不同,应用程序便不能安装成功。
2)生成CERT.SF文件
在生成MANIFEST.MF文件之后,用SHA1-RSA算法对其进行私钥签名(使用SHA1-RSA算法,用私钥对MANIFEST.MF摘要文件签名,并对其中每个文件摘要签名),便生成CERT.SF。具体代码如下:
1.  Signature signature = Signature.getInstance("SHA1withRSA");
2.  signature.initSign(privateKey);  
3.  je = new JarEntry(CERT_SF_NAME);  
4.  je.setTime(timestamp);  
5.  outputJar.putNextEntry(je);  
6.  writeSignatureFile(manifest, newSignatureOutputStream(outputJar, signature));
RSA是目前最有影响力的公钥加密算法,是一种非对称加密算法、能够同时用于加密和数字签名。由于RSA是非对称加密算法,因此用私钥对生成MANIFEST.MF的数字签名加密后,在APK安装时只能使用公钥才能解密它。
3)生成CERT.RSA文件
生成CERT.RSA文件与生成CERT.SF文件不同之处在于,生成CERT.RSA文件使用了公钥文件。CERT.RSA文件中保存了公钥以及所用的采用加密算法等信息。具体代码如下:
1.  je = new JarEntry(CERT_RSA_NAME);  
2.  je.setTime(timestamp);  
3.  outputJar.putNextEntry(je);  
4.  writeSignatureBlock(signature, publicKey, outputJar);
通过以上对Android应用程序签名的代码分析,可以看出Android系统通过对第三方APK包进行签名,达到保护系统安全的目的。应用程序签名主要用于对开发者身份进行识别,达到防范恶意攻击的目的,但不能有效地限制应用程序被恶意修改,只能够检测应用程序是否被修改过,如果应用程序被修改应该再采取相应的应对措施。

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
MistyRain + 1 + 1 我很赞同!
沉浮696 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bxxb555 发表于 2015-1-8 18:21
我的世界:侠盗猎车手    2.0.2版好像就是用的Key   直接搜索数据 搜不到   改存档 进游戏 又还原了   让我这渣渣新手简直绝望
有兴趣的可以试着破解一下   练手挺好的
35925 发表于 2015-1-8 11:11
落魄狂人 发表于 2016-9-13 20:43
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表