Android覆盖升级以及apk签名的实现思路

合集下载

Android的打包签名

Android的打包签名

Android的打包签名1.为什么要签名?开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的。

由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相同名字,但是签名不同的包不被替换。

APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本,这样可以防止你已安装的应用被恶意的第三方覆盖或替换掉。

这样签名其实也是开发者的身份标识。

交易中抵赖等事情发生时,签名可以防止抵赖的发生。

在Android 系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立的信任关系,如果一个permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限。

Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制。

Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。

Android将数字证书用来标识应用程序的作者和在应用程序之间建立的信任关系,不是用来决定最终用户可以安装哪些应用程序。

这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。

2.签名的注意事项1.所有的Android应用都必须有数字签名,没有不存在数字签名的应用,包括模拟器上运行的。

Android系统不会安装没有数字证书的应用。

2.签名的数字证书不需要权威机构来认证,是开发者自己产生的数字证书,即所谓的自签名。

3.正式发布一个Android应用时,必须使用一个合适的私钥生成的数字证书来给程序签名,不能使用ADT插件或者ANT工具生成的调试证书来发布。

Android覆盖升级以及apk签名

Android覆盖升级以及apk签名

b) 为apk文件签名
$ jarsigner -verbose -keystore keyfile -signedjar signed.apk base.apk yan
注:keyfile为生成key存放的文件,signed.apk为签名后的apk,base.apk 为未签名的apk,yan为私钥
c) 看某个apk是否经过了签名
build/target/product/security目录中有四组默认签名可选:testkey platform shared media(具体见README.txt),应用程序中Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.
$ jarsigner -verify my_application.apk
d) 优化(签名后需要做对齐优化处理)
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
3) 在源码中编译的签名
a) 使用源码中的gn优化程序
6) Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序
3. 签名的方法
1) 用eclipse插件方式签名
a) 调试签名
eclipse插件默认赋予程序一个DEBUG权限的签名,此签名的程序不能发布到market上,此签名有效期为一年,如果过期则导致你无法生成apk文件,此时你只要删除debug keystore即可,系统又会为你生成有效期为一年的新签名
b) 在源码中自签名
Android提供了一个脚本mkkey.sh(build/target/product/security/mkkey.sh),用于生成密钥,生成后在应用程序中通过Android.mk中的LOCAL_CERTIFICATE字段指名用哪个签名

Apk反编译及签名工具使用

Apk反编译及签名工具使用

Apk反编译及签名工具使用1) APKtool软件包及签名toolAPKtool软件包有2个程序组成:apktool.jar 和aapt.exe另外提供一个批处理文件:apktool.bat,其内容为:java -jar "%~dp0\apktool.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9运行apktools.jar需要java环境(1.6.0版本以上)。

apktool.jar用于解包,apktool.jar和aapt.exe联合用于打包。

signapk.jar 用于签名。

2) APK文件的解包下面以解开Contacts.apk为例。

首先把Contacts.apk Copy到当前工作目录下(例:Test)。

在DOS下打入命令apktool d Contacts.apk ABC这里“d”表示要解码。

Contacts.apk是要解包的APK文件。

ABC是子目录名。

所有解包的文件都会放在这个子目录内。

3) APK文件的打包在DOS下打入命令apktool b ABC New-Contacts.apk这里“b”表示要打包ABC是子目录名,是解包时产生的子目录,用来存放所有解包后的和修改后的文件。

New-Contacts.apk是打包后产生的新的APK文件。

4) 签名,不签名安装时可能提示如下错误:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] --- 没有签名,可以尝试test证书;签名方法见下面。

Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES] ---- 已存在签名,但使用证书不对,可以尝试使用其他证书签名。

签名方法:到目录android\build\target\product\security找到证书文件,这里可能会有几种证书,test/shared/platform/media,各种证书使用场景不同,可以自己google一下,因为签名很快而且可任意后续更改签名,可以自己尝试各种不同签名;这个命令行是使用test证书的例子:java -jar signapk.jar testkey.x509.pem testkey.pk8 YOURAPK.apk YOURAPK_signed.apkYOURAPK_signed.apk就是签完名的apk,去测试一下您重新打包的apk吧。

apk签名原理及实现

apk签名原理及实现

apk签名原理及实现发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的。

签名机制在Android应用和框架中有着十分重要的作用。

例如,Android系统禁止更新安装签名不一致的APK;如果应用需要使用system权限,必须保证APK签名与Framework签名一致,等等。

在《APK Crack》一文中,我们了解到,要破解一个APK,必然需要重新对APK进行签名。

而这个签名,一般情况无法再与APK原先的签名保持一致。

(除非APK原作者的私钥泄漏,那已经是另一个层次的软件安全问题了。

)简单地说,签名机制标明了APK的发行机构。

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

Android签名机制为了说明APK签名比对对软件安全的有效性,我们有必要了解一下Android APK的签名机制。

为了更易于大家理解,我们从Auto-Sign工具的一条批处理命令说起。

在《APK Crack》一文中,我们了解到,要签名一个没有签名过的APK,可以使用一个叫作Auto-sign的工具。

Auto-sign工具实际运行的是一个叫做Sign.bat的批处理命令。

用文本编辑器打开这个批处理文件,我们可以发现,实现签名功能的命令主要是这一行命令:这条命令的意义是:通过signapk.jar这个可执行jar包,以“testkey.x509.pem”这个公钥文件和“testkey.pk8”这个私钥文件对“update.apk”进行签名,签名后的文件保存为“update_signed.apk”。

对于此处所使用的私钥和公钥的生成方式,这里就不做进一步介绍了。

这方面的资料大家可以找到很多。

我们这里要讲的是signapk.jar到底做了什么。

signapk.jar是Android源码包中的一个签名工具。

由于Android 是个开源项目,所以,很高兴地,我们可以直接找到signapk.jar的源码!路径为/build/tools/signapk/SignApk.java。

详解Androidv1、v2、v3签名(小结)

详解Androidv1、v2、v3签名(小结)

详解Androidv1、v2、v3签名(⼩结)Android签名机制什么是Android签名了解 HTTPS 通信的同学都知道,在消息通信时,必须⾄少解决两个问题:⼀是确保消息来源的真实性,⼆是确保消息不会被第三⽅篡改。

同理,在安装 apk 时,同样也需要确保 apk 来源的真实性,以及 apk 没有被第三⽅篡改。

为了解决这⼀问题,Android官⽅要求开发者对 apk 进⾏签名,⽽签名就是对apk进⾏加密的过程。

要了解如何实现签名,需要了解两个基本概念:消息摘要、数字签名和数字证书。

消息摘要消息摘要(Message Digest),⼜称数字摘要(Digital Digest)或数字指纹(Finger Print)。

简单来说,消息摘要就是在消息数据上,执⾏⼀个单向的 Hash 函数,⽣成⼀个固定长度的Hash值,这个Hash值即是消息摘要。

上⾯提到的的加密 Hash 函数就是消息摘要算法。

它有以下特征:⽆论输⼊的消息有多长,计算出来的消息摘要的长度总是固定的。

例如:应⽤ MD5 算法摘要的消息有128个⽐特位,⽤ SHA-1 算法摘要的消息最终有 160 ⽐特位的输出,SHA-1 的变体可以产⽣ 192 ⽐特位和 256 ⽐特位的消息摘要。

⼀般认为,摘要的最终输出越长,该摘要算法就越安全。

消息摘要看起来是「随机的」。

这些⽐特看上去是胡乱的杂凑在⼀起的。

可以⽤⼤量的输⼊来检验其输出是否相同,⼀般,不同的输⼊会有不同的输出,⽽且输出的摘要消息可以通过随机性检验。

但是,⼀个摘要并不是真正随机的,因为⽤相同的算法对相同的消息求两次摘要,其结果必然相同;⽽若是真正随机的,则⽆论如何都是⽆法重现的。

因此消息摘要是「伪随机的」。

消息摘要函数是单向函数,即只能进⾏正向的信息摘要,⽽⽆法从摘要中恢复出任何的消息,甚⾄根本就找不到任何与原信息相关的信息。

当然,可以采⽤强⼒攻击的⽅法,即尝试每⼀个可能的信息,计算其摘要,看看是否与已有的摘要相同,如果这样做,最终肯定会恢复出摘要的消息。

android 覆盖apk原理

android 覆盖apk原理

android 覆盖apk原理Android覆盖APK原理概述在Android应用开发中,经常需要对已经安装的应用进行更新或者修复,而覆盖APK是一种常见的更新方式。

本文将介绍Android 覆盖APK的原理以及相关技术。

一、什么是APKAPK(Android Package Kit)是Android应用的安装包,它包含了应用的所有资源文件、源代码以及清单文件等。

当我们安装一个应用时,实际上是将APK文件解压并将其中的资源文件、代码等安装到设备上。

二、为什么需要覆盖APK在软件开发过程中,经常会有新版本的发布,包括功能的增加、优化以及错误的修复。

为了让用户享受到最新的功能和修复最新的问题,需要将新版本的APK覆盖到已经安装的应用上,从而实现应用的更新。

三、覆盖APK的原理覆盖APK的原理主要涉及到两个方面,即签名验证和应用替换。

1. 签名验证在Android系统中,每个应用都有一个唯一的数字签名,用于保证应用的安全性。

当我们安装一个应用时,系统会验证APK文件的签名是否与设备上已安装应用的签名一致。

如果一致,系统会认为是同一个应用,并允许覆盖安装;如果不一致,系统会提示签名不一致,无法覆盖安装。

2. 应用替换当签名验证通过后,系统会将新版本的APK文件解压并替换掉已安装应用的资源文件、代码等。

然后重新加载应用,使得用户可以使用更新后的应用。

需要注意的是,在覆盖APK时,系统会保留应用的数据和用户设置,以确保用户不会因为更新应用而丢失重要的数据。

四、覆盖APK的实现方式在Android开发中,覆盖APK的实现方式有多种,包括通过应用商店更新、通过网络下载更新、通过本地安装包更新等。

1. 应用商店更新通过应用商店更新是最常见的方式之一。

应用商店会检测应用的版本号,并提醒用户进行更新。

用户点击更新按钮后,应用商店会下载新版本的APK文件并进行覆盖安装。

2. 网络下载更新有些应用会在启动时通过网络检测是否有新版本,如果有,则会下载新版本的APK文件,并提示用户进行覆盖安装。

apk签名原理

apk签名原理

apk签名原理
APK(Android Package)的签名原理如下:
1. 建立一个密钥库(Keystore):开发者使用Java的keytool
命令创建一个密钥库,保存私钥和对应的证书。

密钥库通常以.jks或.keystore文件格式保存。

2. 生成私钥和公钥对:使用keytool命令生成一个私钥和对应
的公钥。

私钥存储在密钥库中,而公钥将在APK文件中使用。

3. 生成证书签名请求(CSR):开发者使用keytool命令生成
一个证书签名请求,其中包含公钥和申请者的信息。

4. 证书颁发机构(CA)颁发签名证书:开发者将CSR文件发
送给证书颁发机构,机构会验证申请者信息并使用私钥对公钥进行签名。

然后,机构会颁发一个包含签名的证书。

5. 使用私钥对APK文件进行签名:开发者使用keytool或者Android Studio的构建工具将APK文件与开发者的私钥一起进
行签名。

6. 在Android系统中验证签名:当用户在设备上安装APK文
件时,Android系统会使用APK中包含的签名和证书进行验证。

系统会对签名进行检查,确保它与签名证书对应,并且证书的数字签名也是有效的。

通过签名,Android系统可以确保APK文件的完整性和身份认
证。

如果APK文件的签名无效或与证书不匹配,系统会禁止安装或者警告用户。

这个机制有助于防止未经授权的APK文件被安装,保护用户数据的安全性。

做自己的Android ROM-屏蔽apk签名检查

做自己的Android ROM-屏蔽apk签名检查

做自己的Android ROM,屏蔽对framework中的系统APK的签名检查作者:孤风一剑发布:2013-09-04 15:14 栏目:移动开发点击:538次抢沙发最近两天一直在尝试更新Android中的关键库以达到定制ROM的效果,中间比较曲折,记录下来供自己和大家参考。

因为我需要基于Android的原生代码做一定的修改,所以如果无法将我自己编译出的APK或Jar替换系统中的东西,则无法达成我的目标。

我的测试的机器:htc one 电信定制版(802d),Android版本:4.2.2;LG Nexus 4,Android版本:4.3。

测试第一步:将手机root掉,以替换修改系统文件的权限。

不同厂商的手机的root步骤不一样,自己上网搜索吧。

测试第二步:使用我自己编译出来的SystemUI.apk,替换Nexus 4的SystemUI.apk,通过adb logcat > 1.txt 查看日志,直接报下面的错;[plain][/plain] view plaincopyprint?1.W/PackageManager( 530): Signature mismatch for shared user : SharedUserSetting{41ea0bc8 android.uid.system/1000}2.3.E/PackageManager( 530): Package com.android.systemui has no signatures that match those in shared user android.uid.system; ignoring!签名有问题,根据这个关键字“has no signatures that match those”去搜索Android源代码,可以在PackageManagerService.java中找到如下函数:[java][/java] view plaincopyprint?1.private boolean verifySignaturesLP(PackageSetting pkgSetting,2. PackageParser.Package pkg) {3. if (pkgSetting.signatures.mSignatures != null) {4. // Already existing package. Make sure signatures match5. if (compareSignatures(pkgSetting.signatures.mSignatures, pkg.mSignatures) !=6. PackageManager.SIGNA TURE_MATCH) {7. Slog.e(TAG, "Package " + pkg.packageName8. + " signatures do not match the previously installed version; ignoring!");9. mLastScanError = PackageManager.INSTALL_FAILED_UPDA TE_INCOMPATIBLE;10. return false;11. }12. }13. // Check for shared user signatures14. if (pkgSetting.sharedUser != null && pkgSetting.sharedUser.signatures.mSignatures !=null) {15. if (compareSignatures(pkgSetting.sharedUser.signatures.mSignatures,16. pkg.mSignatures) != PackageManager.SIGNATURE_MATCH) {17. Slog.e(TAG, "Package " + pkg.packageName18. + " has no signatures that match those in shared user "19. + + "; ignoring!");20. mLastScanError = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;21. return false;22. }23. }24. return true;25.}直接替换,肯定是不行了,签名通不过,那我可否尝试将签名检查的代码给屏蔽掉?测试第三步:尝试屏蔽对系统级APK的签名检查,代码已经找到,在这个目录下:frameworks/base/services/java/com/android/server/pm。

【安卓开发 导出apk文件 一定要设置签名吗】

【安卓开发 导出apk文件 一定要设置签名吗】

【安卓开发导出apk文件一定要设置签名吗】只要你运行过android项目,到工作目录的bin文件夹下就能找到与项目同名的apk文件,这种apk默认是已经使用debug用户签名的。

为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装)。

Eclipse直接能导出带签名的最终apk,非常方便,推荐使用,步骤如下:第二步:创建密钥库keystore,输入密钥库导出位置和密码,记住密码,下次Use existing keystore会用到。

第三步:填写密钥库信息,填写一些apk文件的密码,使用期限和组织单位的信息。

如上,zipalign能够使apk文件中未压缩的数据在4个字节边界上对齐(4个字节是一个性能很好的值),这样android系统就可以使用mmap()(请自行查阅这个函数的用途)函数读取文件,可以在读取资源上获得较高的性能,PS:1.在4个字节边界上对齐的意思就是,一般来说,是指编译器吧4个字节作为一个单位来进行读取的结果,这样的话,CPU能够对变量进行高效、快速的访问(较之前不对齐)。

2.对齐的根源:android系统中的Davlik虚拟机使用自己专有的格式DEX,DEX的结构是紧凑的,为了让运行时的性能更好,可以进一步用对齐进一步优化,但是大小一般会有所增加。

你不可能只做一个APP,你可能有一个宏伟的战略工程,想要在生活,服务,游戏,系统各个领域都想插足的话,你不可能只做一个APP,谷歌建议你把你所有的APP都使用同一个签名证书。

使用你自己的同一个签名证书,就没有人能够覆盖你的应用程序,即使包名相同,所以影响有:1) App升级。

使用相同签名的升级软件可以正常覆盖老版本的软件,否则系统比较发现新版本的签名证书和老版本的签名证书不一致,不会允许新版本安装成功的。

APK签名命令的使用方法和步骤详解

APK签名命令的使用方法和步骤详解

APK签名命令的使用方法和步骤详解APK签名命令是应用程序开发中非常重要的一个步骤,它能够保护应用程序的完整性,保证应用安全性。

本文将为你详细介绍APK签名命令的使用方法和步骤,以帮助你更好的理解和使用APK签名命令。

一、什么是APK签名命令APK签名命令是用于给安装包进行数字签名的一项命令行工具。

一般用在应用程序开发完成后,通过签名才能发布和安装,并可以保证签名后的应用程序在安装时不被篡改。

APK签名方式有两种:V1签名和V2签名。

其中V1签名使用JAR签名、V2签名使用APK Signature Scheme v2 签名方式。

二、APK签名命令的使用方法1.首先在电脑端安装JDK环境,然后在安卓开发包中找到build-tool中的zip文件夹,将zip中的apksigner.bat文件复制到Windows\Systm32目录下。

2.将需要签名的应用加载到电脑中,然后打开CMD命令行工具。

3.在CMD中输入apksigner.bat命令,并按照下面的方式对应输入:```apksigner.bat sign --ks my.keystore --ks-key-alias mykeyalias my-app.apk```其中my.keystore是你的密钥文件名,mykeyalias是密钥别名,my-app.apk是需要签名的文件名。

4.按下回车键后,CMD会提示你输入密钥密码,之后输入签名证书密码,如果全部输入正确,签名过程就会自动完成。

5.签名完成后,在你的APK文件目录下,你可以找到一个新的已经签名的.apk文件。

这个签名后的APK文件可以安全地分发给其他用户。

三、APK签名命令的步骤详解步骤1:准备你的密钥在对APK签名之前,你需要先为APK创建一个签名密钥。

密钥是用来验证APK的完整性。

签名密钥是一个重要的文件,它会让应用程序可以广泛传播。

因此,你需要妥善保管这个文件,以免遭到泄露或滥用。

Android的APK应用签名机制以及读取签名的方法

Android的APK应用签名机制以及读取签名的方法

Android的APK应⽤签名机制以及读取签名的⽅法发布过Android应⽤的朋友们应该都知道,Android APK的发布是需要签名的。

签名机制在Android应⽤和框架中有着⼗分重要的作⽤。

例如,Android系统禁⽌更新安装签名不⼀致的APK;如果应⽤需要使⽤system权限,必须保证APK签名与Framework签名⼀致,等等。

什么是签名⾸先我们得知道什么是摘要,摘要是指采⽤单向Hash函数对数据进⾏计算⽣成的固定长度的Hash值,摘要算法有Md5,Sha1等,Md5⽣成的Hash值是128位的数字,即16个字节,⽤⼗六进制表⽰是32个字符,Sha1⽣成的Hash值是160位的数字,即20个字节,⽤⼗六进制表⽰是40个字符。

我们是不能通过摘要推算出⽤于计算摘要的数据,如果修改了数据,那么它的摘要⼀定会变化(其实这句话并不正确,只是很难正好找到不同的数据,⽽他们的摘要值正好相等)。

摘要经常⽤于验证数据的完整性,很多下载⽹站都会列出下载⽂件的md5值或者sha1值。

摘要和签名没有任何关系,⽹上常常将摘要和签名混为⼀谈,这是错误的。

签名和数字签名是同⼀个概念,是指信息的发送者⽤⾃⼰的私钥对消息摘要加密产⽣⼀个字符串,加密算法确保别⼈⽆法伪造⽣成这段字符串,这段数字串也是对信息的发送者发送信息真实性的⼀个有效证明。

其他发送者⽤他们的私钥对同⼀个消息摘要加密会得到不同的签名,接收者只有使⽤发送者签名时使⽤的私钥对应的公钥解密签名数据才能得到消息摘要,否则得到的不是正确的消息摘要。

数字签名是⾮对称密钥加密技术+数字摘要技术的结合。

数字签名技术是将信息摘要⽤发送者的私钥加密,和原⽂以及公钥⼀起传送给接收者。

接收者只有⽤发送者的公钥才能解密被加密的信息摘要,然后接收者⽤相同的Hash函数对收到的原⽂产⽣⼀个信息摘要,与解密的信息摘要做⽐对。

如果相同,则说明收到的信息是完整的,在传输过程中没有被修改;不同则说明信息被修改过,因此数字签名能保证信息的完整性。

android apk修改方法(反编译、修改、打包)

android apk修改方法(反编译、修改、打包)

1、baksmali:classes.dex反编译为smali格式(smali:smali格式编译打包为classes.dex,但由于smali格式类似汇编,比较难阅读,所以用dex2jar进行辅助)2、dex2jar:classes.dex转为jar包3、jdgui:jar反编译并阅读操作顺序:apk用zip解开,里面的classes.dex分别用baksmali处理为smali,用dex2jar 处理成jar,然后用jdgui看代码,找好java文件中要改的位置后,在smali 里找对应的位置修改,改完了用smali再编译为classes.dex,覆盖原来apk里的同名文件,最后重新签名。

注意安装时要先删除原来手机里的版本,因为签名不同。

1、apk用zip解开,得到classes.dex2、用baksmali处理为smali(只是反编译看代码就不需要这一步,修改才用) java -jar baksmali-1.4.1.jar -x classes.dex得到out目录,里面是smali文件3、用dex2jar处理classes.dex为jar包dex2jar.bat classes.dex得到classes.dex.dex2jar.jar4、用jdgui打开classes.dex.dex2jar.jar好了,可以看代码,但还不能直接修改,需要对比着来修改smali文件改好后,用java -jar smali-1.2.6.jar -o classes.dex out得到修改后的classes.dex,用这个文件替换fishing_joy_1.apk中的同名文件但这个apk是不能用的,还没有进行重新签名先用keytool生成keystorekeytool -genkey -keystore mykeystore -alias mykeystore -validity 999 把apk中的META-INF删除,再用jarsigner 签名jarsigner -verbose -keystore mykeystore -signedjar fishing_joy_1_signed.apk fishing_joy_1.apk mykeystore先卸载原来手机中安装的这个游戏,再用fishing_joy_1_signed.apk安装最后工作目录是这个样子。

Android获取apk签名指纹的md5值(防止重新被打包)的实现方法

Android获取apk签名指纹的md5值(防止重新被打包)的实现方法

Android获取apk签名指纹的md5值(防⽌重新被打包)的实现⽅法本⽂实例讲述了Android获取apk签名指纹的md5值以防⽌重新被打包的实现⽅法。

分享给⼤家供⼤家参考,具体如下:做个记录(这⾥只是Java层的签名校验,java层容易被破解,我建议apk加固下)获取md5值来进⾏Apk签名校验,可以防⽌apk重新被打包。

下⾯我说说怎么获取apk签名的md5值(有三种⽅法)1.⽤代码获取签名指纹的md5值/*** MD5加密* @param byteStr 需要加密的内容* @return 返回 byteStr的md5值*/public static String encryptionMD5(byte[] byteStr) {MessageDigest messageDigest = null;StringBuffer md5StrBuff = new StringBuffer();try {messageDigest = MessageDigest.getInstance("MD5");messageDigest.reset();messageDigest.update(byteStr);byte[] byteArray = messageDigest.digest();for (int i = 0; i < byteArray.length; i++) {if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));} else {md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));}}} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return md5StrBuff.toString();}/*** 获取app签名md5值*/public String getSignMd5Str() {try {PackageInfo packageInfo = mActivity.getPackageManager().getPackageInfo(mActivity.getPackageName(), PackageManager.GET_SIGNATURES); Signature[] signs = packageInfo.signatures;Signature sign = signs[0];String signStr = encryptionMD5(sign.toByteArray());return signStr;} catch (NotFoundException e) {e.printStackTrace();}return "";}2. keytool⼯具使⽤keytool⼯具获取签名md5信息,下⾯ key是签名⽂件复制代码代码如下:C:\Program Files\Java\jdk1.8.0_05\bin>keytool -list -v -keystore C:\Users\Administrator\Desktop\key3. Eclipse ⾥⾯可以查看签名信息这⾥就不赘述更多关于Android相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Android程序设计有所帮助。

Android中APK签名工具之jarsigner和apksigner详解

Android中APK签名工具之jarsigner和apksigner详解

Android中APK签名⼯具之jarsigner和apksigner详解⼀.⼯具介绍jarsigner是JDK提供的针对jar包签名的通⽤⼯具,位于JDK/bin/jarsigner.exeapksigner是Google官⽅提供的针对Android apk签名及验证的专⽤⼯具,位于Android SDK/build-tools/SDK版本/apksigner.bat不管是apk包,还是jar包,本质都是zip格式的压缩包,所以它们的签名过程都差不多(仅限V1签名),以上两个⼯具都可以对Android apk包进⾏签名.1.V1和V2签名的区别在Android Studio中点击菜单 Build->Generate signed apk... 打包签名过程中,可以看到两种签名选项 V1(Jar Signature) V2(Full APK Signature),刚开始升级AS看到这个懵了,既然是APK Signature,就放⼼偷懒选了V2,结果安装失败⽆奈,只能查资料...从Android 7.0开始, ⾕歌增加新签名⽅案 V2 Scheme (APK Signature);但Android 7.0以下版本, 只能⽤旧签名⽅案 V1 scheme (JAR signing)V1签名:来⾃JDK(jarsigner), 对zip压缩包的每个⽂件进⾏验证, 签名后还能对压缩包修改(移动/重新压缩⽂件)对V1签名的apk/jar解压,在META-INF存放签名⽂件(MANIFEST.MF, CERT.SF, CERT.RSA),其中MANIFEST.MF⽂件保存所有⽂件的SHA1指纹(除了META-INF⽂件), 由此可知: V1签名是对压缩包中单个⽂件签名验证V2签名:来⾃Google(apksigner), 对zip压缩包的整个⽂件验证, 签名后不能修改压缩包(包括zipalign),对V2签名的apk解压,没有发现签名⽂件,重新压缩后V2签名就失效, 由此可知: V2签名是对整个APK签名验证V2签名优点很明显:签名更安全(不能修改压缩包)签名验证时间更短(不需要解压验证),因⽽安装速度加快注意: apksigner⼯具默认同时使⽤V1和V2签名,以兼容Android 7.0以下版本2.zipalign和V2签名位于Android SDK/build-tools/SDK版本/zipalign.exezipalign 是对zip包对齐的⼯具,使APK包内未压缩的数据有序排列对齐,从⽽减少APP运⾏时内存消耗zipalign -v 4 in.apk out.apk //4字节对齐优化zipalign -c -v 4 in.apk //检查APK是否对齐zipalign可以在V1签名后执⾏但zipalign不能在V2签名后执⾏,只能在V2签名之前执⾏⼆.签名步骤1.⽣成密钥对(已有密钥库,可忽略)Eclipse或Android Studio在Debug时,对App签名都会使⽤⼀个默认的密钥库:默认在C:\Users\⽤户名\.android\debug.keystore密钥库名: debug.keystore密钥别名: androiddebugkey密钥库密码: android1.⽣成密钥对进⼊JDK/bin, 输⼊命令keytool -genkeypair -keystore 密钥库名 -alias 密钥别名 -validity 天数 -keyalg RSA参数:-genkeypair ⽣成⼀条密钥对(由私钥和公钥组成)-keystore 密钥库名字以及存储位置(默认当前⽬录)-alias 密钥对的别名(密钥库可以存在多个密钥对,⽤于区分不同密钥对)-validity 密钥对的有效期(单位: 天)-keyalg ⽣成密钥对的算法(常⽤RSA/DSA,DSA只⽤于签名,默认采⽤DSA) -delete 删除⼀条密钥提⽰: 可重复使⽤此条命令,在同⼀密钥库中创建多条密钥对例如:在debug.keystore中新增⼀对密钥,别名是releasekeytool -genkeypair -keystore debug.keystore -alias release -validity 300002.查看密钥库进⼊JDK/bin, 输⼊命令keytool -list -v -keystore 密钥库名参数:-list 查看密钥列表-v 查看密钥详情例如:keytool -list -v -keystore debug.keystore现在debug.keystore密钥库中有两对密钥, 别名分别是androiddebugkey release2.签名1.⽅法⼀(jarsigner,只⽀持V1签名)进⼊JDK/bin, 输⼊命令jarsigner -keystore 密钥库名 xxx.apk 密钥别名从JDK7开始, jarsigner默认算法是SHA256, 但Android 4.2以下不⽀持该算法,所以需要修改算法, 添加参数 -digestalg SHA1 -sigalg SHA1withRSAjarsigner -keystore 密钥库名 -digestalg SHA1 -sigalg SHA1withRSA xxx.apk 密钥别名参数:-digestalg 摘要算法-sigalg 签名算法例如:⽤JDK7及以上jarsigner签名,不⽀持Android 4.2 以下jarsigner -keystore debug.keystore MyApp.apk androiddebugkey⽤JDK7及以上jarsigner签名,兼容Android 4.2 以下jarsigner -keystore debug.keystore -digestalg SHA1 -sigalg SHA1withRSA MyApp.apk androiddebugkey2.⽅法⼆(apksigner,默认同时使⽤V1和V2签名)进⼊Android SDK/build-tools/SDK版本, 输⼊命令apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 xxx.apk若密钥库中有多个密钥对,则必须指定密钥别名apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 xxx.apk禁⽤V2签名apksigner sign --v2-signing-enabled false --ks 密钥库名 xxx.apk参数:--ks-key-alias 密钥别名,若密钥库有⼀个密钥对,则可省略,反之必选--v1-signing-enabled 是否开启V1签名,默认开启--v2-signing-enabled 是否开启V2签名,默认开启例如:在debug.keystore密钥库只有⼀个密钥对apksigner sign --ks debug.keystore MyApp.apk在debug.keystore密钥库中有多个密钥对,所以必须指定密钥别名apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey MyApp.apk3.签名验证1.⽅法⼀(keytool,只⽀持V1签名校验)进⼊JDK/bin, 输⼊命令keytool -printcert -jarfile MyApp.apk (显⽰签名证书信息)参数:-printcert 打印证书内容-jarfile <filename> 已签名的jar⽂件或apk⽂件2.⽅法⼆(apksigner,⽀持V1和V2签名校验)进⼊Android SDK/build-tools/SDK版本, 输⼊命令apksigner verify -v --print-certs xxx.apk参数:-v, --verbose 显⽰详情(显⽰是否使⽤V1和V2签名)--print-certs 显⽰签名证书信息例如:apksigner verify -v MyApp.apkVerifiesVerified using v1 scheme (JAR signing): trueVerified using v2 scheme (APK Signature Scheme v2): trueNumber of signers: 1总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

android glide signature用法

android glide signature用法

android glide signature用法Android Glide是一款强大而灵活的图片加载库,它能够帮助开发人员有效地处理图片加载,并提供一系列的功能和选项来优化图片的显示和加载效果。

其中,Glide的签名(Signature)功能是非常重要且有用的,它可以确保加载到的图片是最新的,从而提供更好的用户体验。

本篇文章将一步一步地回答关于Android Glide Signature用法的问题,以帮助开发人员更好地理解和使用这个功能。

第一步:了解Glide的签名(Signature)概念在使用Glide加载图片时,我们通常会遇到一些缓存问题,例如当图片被修改或更新后,Glide可能仍然加载之前的缓存图片,导致显示的图片与实际图片不符。

为了解决这个问题,Glide引入了签名(Signature)的概念。

签名是一个用于识别图片的唯一标识符,当加载图片时,Glide会比较目标图片的签名和缓存图片的签名,如果两者不同,Glide将重新加载图片;如果两者相同,Glide则会使用缓存图片。

通过使用签名,我们可以确保最新的图片会被正确地显示出来。

第二步:使用默认的签名Glide提供了默认的签名机制,它会根据目标图片的URL或者文件路径来生成签名。

我们可以直接使用默认的签名机制,无需做任何额外的配置。

例如,我们可以使用以下代码来加载一张图片:Glide.with(context).load(url).into(imageView);在这个例子中,Glide会根据URL生成一个默认的签名,并将其用于比较缓存图片的签名。

如果目标图片的URL发生了变化,Glide将重新加载图片,确保显示的是最新的图片。

第三步:自定义签名除了使用默认的签名机制,Glide还提供了一种自定义签名的方式,以满足更复杂的需求。

通过实现`Key`接口,我们可以创建一个自定义的签名,例如:public class MySignature implements Key {private String versionCode;public MySignature(Context context) {PackageManager pm = context.getPackageManager();try {PackageInfo info =pm.getPackageInfo(context.getPackageName(), 0);versionCode = String.valueOf(info.versionCode);} catch (NotFoundException e) {e.printStackTrace();}}Overridepublic String toString() {return "MySignature{" +"versionCode='" + versionCode + '\'' +'}';}Overridepublic void updateDiskCacheKey(MessageDigest messageDigest) {messageDigest.update(versionCode.getBytes());}Overridepublic int hashCode() {return toString().hashCode();}Overridepublic boolean equals(Object obj) {return obj instanceof MySignature &&toString().equals(obj.toString());}}在这个例子中,我们创建了一个名为`MySignature`的自定义签名。

安卓破解必备 签名验证原理

安卓破解必备  签名验证原理
(通过私钥加密的信息唯有公钥才能解密,可以验证这条消息肯定是A发出来的)
在Android里面签名验证的实现:
覆盖安装时用旧版本的公钥对新安装apk包中MANIFEST.MF进行加密,生成新的MANIFEST.MF'文件,再和原始的MANIFEST.MF文件对比所有的摘要信息是否一致,以此确保是否为同一个机构发布的升级app。(实际当然不是生成新的MANIFEST.MF'文件,可以这么理解)
插入学习一下RSA加密和签名原理:
RSA有2种应用方式,加密和验证,这里只用到了验证,为了使整个实现过程更加清晰明了,先学习下其原理,这里我们可以假定加密和验证过程无法被破解,通过私钥加密的信息唯有公钥才能解密。
RSA加密过程(以客户端A发送一条消息给客户端B为例,其中A持有公钥,B持有私钥):
解压apk包可以发现未签名的apk中不包含META-INF目录,该目录在签名后生成,其中包含签名信息相关的3个文件CERT.RSA,CERT.SF,MANIFEST.MF,签名过程就是这3个文件的生成过程。
签名第一步:遍历apk中所有文件(entry),逐一生成SHA-1数字签名,然后通过Base64编码,写入MANIFEST.MF文件。
对msg提取摘要:Dig(msg)
对摘要Base64编码:Base64( Dig(msg) )
将摘要当作未加密过的内容,用公钥加密:En( Base64( Dig(msg) ) )
签名验证,即判断En( Base64( Dig(msg) ) ) 和Sign( Base64( Dig(msg) ) )是否相等。(这里的Sign跟上面的De一模一样)
还原msg:UnInt( Int(msg) ) = msg

android md5 签名的生成规则

android md5 签名的生成规则

android md5 签名的生成规则
在Android开发中,MD5签名通常用于验证应用程序的完整性和防止被篡改。

以下是生成MD5签名的基本步骤:
1. 编译应用程序的APK文件:首先,你需要编译你的Android应用程序,生成一个APK文件。

2. 使用`keytool`命令生成密钥:你可以使用Java的`keytool`工具来生成一个密钥。

这个密钥将被用于签名你的APK文件。

3. 使用密钥和`jarsigner`工具签名APK:使用`jarsigner`工具和你在上一步中生成的密钥来签名你的APK文件。

这一步将生成一个MD5签名。

这些步骤通常在开发过程中自动完成,但如果你需要手动生成MD5签名,你可以使用Java的`keytool`和`jarsigner`工具。

请注意,随着Android版本的发展,签名过程可能会发生变化。

确保你遵循的是与你正在开发的Android版本相匹配的签名指南。

AndroidApk去掉签名以及重新签名的方法

AndroidApk去掉签名以及重新签名的方法

AndroidApk去掉签名以及重新签名的⽅法Android Apk去掉签名以及重新签名的⽅法Android开发中很重要的⼀部就是⽤⾃⼰的密钥给Apk⽂件签名,不经过签名的Apk⽂件⼀般是⽆法安装的,就算装了最后也是失败。

⽹上流传的“勾选允许安装未知来源的应⽤”其实跟签不签名没啥关系,说⽩了就是允许安装不从电⼦市场上下载的应⽤⽽已。

近⼏⽇需要修改⼀个Apk中JNI调⽤的.so⽂件,苦于没有apk源代码,只好研究了⼀下签名相关的问题。

当然有很多第三⽅⼯具可以做到,但其实JDK中已经提供了强⼤的签名⼯具jarsigner。

1.去除签名其实很简单,⽤WinRAR打开apk,找到META-INF⽂件夹,删除MANIFEST.MF之外的所有其他⽂件即可。

2.签名运⾏jarsigner,如果没有设置PATH环境变量,那可以从JDK安装路径下的bin⽬录中找到,⽐如我本机的就是C:\Program Files\Java\jdk1.8.0_31\bin\jarsigner.exejarsigner⽤法如下:⽤法: jarsigner [选项] jar-file 别名jarsigner -verify [选项] jar-file [别名...][-keystore <url>] 密钥库位置[-storepass <⼝令>] ⽤于密钥库完整性的⼝令[-storetype <类型>] 密钥库类型[-keypass <⼝令>] 私有密钥的⼝令 (如果不同)[-certchain <⽂件>] 替代证书链⽂件的名称[-sigfile <⽂件>] .SF/.DSA ⽂件的名称[-signedjar <⽂件>] 已签名的 JAR ⽂件的名称[-digestalg <算法>] 摘要算法的名称[-sigalg <算法>] 签名算法的名称[-verify] 验证已签名的 JAR ⽂件[-verbose[:suboptions]] 签名/验证时输出详细信息。

Unity教程之-Unity3d中针对AndroidApk的签名验证(C#实现)

Unity教程之-Unity3d中针对AndroidApk的签名验证(C#实现)

Unity教程之-Unity3d中针对AndroidApk的签名验证(C#实现)当Unity开发的游戏以Android Apk的形式发布之后,经常会遇到的⼀种情况就是别⼈对我们的游戏进⾏⼆次打包,也就是⽤他们的签名替换掉我们的签名,从⽽堂⽽皇之的将胜利果实占为⼰有。

⾯对这样的情况,我们可以采取的⼀种⽅式就是对Apk包的签名进⾏验证,如果与我们的签名不⼀致,则可以采取⿊屏或者直接退出等⽅式来阻⽌该盗版程序的运⾏。

⽰例代码如下:1using UnityEngine;2using System.Collections;///<summary>3/// Signature verify tool class4///</summary>5public class SignatureVerify6 {7/**8* Verify the signature is correct9**/10public static bool IsCorrect ()11 {12#if UNITY_EDITOR13return true;14#endif1516// 获取Android的PackageManager17 AndroidJavaClass Player = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");18 AndroidJavaObject Activity = Player.GetStatic<AndroidJavaObject> ("currentActivity");19 AndroidJavaObject PackageManager = Activity.Call<AndroidJavaObject> ("getPackageManager");2021// 获取当前Android应⽤的包名22string packageName = Activity.Call<string> ("getPackageName");2324// 调⽤PackageManager的getPackageInfo⽅法来获取签名信息数组25int GET_SIGNATURES = PackageManager.GetStatic<int> ("GET_SIGNATURES");26 AndroidJavaObject PackageInfo = PackageManager.Call<AndroidJavaObject> ("getPackageInfo", packageName, GET_SIGNATURES);27 AndroidJavaObject[] Signatures = PackageInfo.Get<AndroidJavaObject[]> ("signatures");2829// 获取当前的签名的哈希值,判断其与我们签名的哈希值是否⼀致30if (Signatures != null && Signatures.Length > 0)31 {32int hashCode = Signatures [0].Call<int> ("hashCode");33return hashCode == 8888888888;//我们签名的哈希值3435 }36return false;37 }38 }。

Android手机升级包和定制包制作教程

Android手机升级包和定制包制作教程

1.补丁/升级包制作方法1.1ROOT目前的民间ROM 基本上已经自带ROOT 所以省略此步骤当然前提得是ROOT过的1.2工具准备下载安装附件中的R.explorer管理器(rootexplorer.v2.9.4.apk)这个工具的作用是备份APK文件、删除APK文件、查看系统目录里面都有什么下载附件中的AndroidResEdit_By_hanhualan...解压到电脑里(如果不能运行则说明你需要安装.NET Framework 2.0)我们主要用这个来对定制包签名1.3定制包制作知识一般定制ROM(不是美化、也不是制作MOD)其实就是对手机内存里的system/app文件夹的内容进行自定义,自己安装的软件将不会出现在这里,而是\data\文件夹中。

系统所有的程序都在这个文件夹里,比如浏览器、拨号器、联系人等先来看一下通常情况下这个文件夹里都包含什么:\system\app\AlarmClock.apk 闹钟\system\app\AlarmClock.odex\system\app\Browser.apk 浏览器\system\app\Browser.odex\system\app\Bugreport.apk Bug报告\system\app\Bugreport.odex\system\app\Calculator.apk 计算器\system\app\Calculator.odex\system\app\Calendar.apk 日历\system\app\Calendar.odex\system\app\CalendarProvider.apk 日历提供\system\app\CalendarProvider.odex\system\app\Camera.apk 照相机\system\app\Camera.odex\system\app\com.amazon.mp3.apk 亚马逊音乐\system\app\Contacts.apk 联系人\system\app\Contacts.odex\system\app\DownloadProvider.apk 下载提供\system\app\DownloadProvider.odex\system\app\DrmProvider.apk DRM数字版权提供\system\app\DrmProvider.odex\system\app\Email.apk 电子邮件客户端\system\app\Email.odex\system\app\FieldTest.apk 测试程序\system\app\FieldTest.odex\system\app\GDataFeedsProvider.apk GoogleData提供\system\app\GDataFeedsProvider.odex\system\app\Gmail.apk Gmail电子邮件\system\app\Gmail.odex\system\app\GmailProvider.apk Gmail提供\system\app\GmailProvider.odex\system\app\GoogleApps.apk 谷歌程序包\system\app\GoogleApps.odex\system\app\GoogleSearch.apk 搜索工具\system\app\GoogleSearch.odex\system\app\gtalkservice.apk GTalk服务\system\app\gtalkservice.odex\system\app\HTMLViewer.apk HTML查看器\system\app\HTMLViewer.odex\system\app\IM.apk 即使通讯组件包含MSN、yahoo通\system\app\ImCredentialProvider.apk\system\app\ImProvider.apk\system\app\ImProvider.odex\system\app\Launcher.apk 启动加载器\system\app\Launcher.odex\system\app\Maps.odex\system\app\MediaProvider.apk 多媒体播放提供\system\app\MediaProvider.odex\system\app\Mms.apk 短信、彩信\system\app\Mms.odex\system\app\Music.apk 音乐播放器\system\app\Music.odex\system\app\MyFaves.apk T-Mobile MyFaves程序\system\app\MyFaves.odex\system\app\PackageInstaller.apk apk安装程序\system\app\PackageInstaller.odex\system\app\Phone.apk 电话拨号器\system\app\Phone.odex\system\app\Settings.apk 系统设置\system\app\Settings.odex\system\app\SettingsProvider.apk 设置提供\system\app\SettingsProvider.odex\system\app\SetupWizard.apk 设置向导\system\app\SetupWizard.odex\system\app\SoundRecorder.apk 录音工具\system\app\SoundRecorder.odex\system\app\Street.odex\system\app\Sync.apk 同步程序\system\app\Sync.odex\system\app\Talk.apk 语音程序\system\app\Talk.odex\system\app\TelephonyProvider.apk 电话提供\system\app\TelephonyProvider.odex\system\app\Updater.apk 更新程序\system\app\Updater.odex\system\app\Vending.apk 制造商信息\system\app\Vending.odex\system\app\VoiceDialer.apk 语音拨号器\system\app\VoiceDialer.odex\system\app\YouTube.apk Youtube视频\system\app\YouTube.odex然后是定制包的结构,定制包的命名一般是XXXX(英文).zip内容包括/system/app/my.apk(你想要放进系统中的程序)/META-INF/com/google/update-script(定制包脚本)/META-INF/CERT.SF(签名文件)/META-INF/CERT.RSA(签名文件)/META-INF/MANIFEST.MF(签名文件)(附件中的custom.zip为范例,大家可以下载直接进行修改)首先应将准备好的程序放进这个ZIP包的/system/app目录里,只要将程序拖进附件中custom.zip的APP目录即可然后删除/META-INF/CERT.RSA和META-INF/CERT.SF这两个文件,为了签名做准备下面我们的来看最后一处需要编辑的地方——脚本1.4脚本:现在我们对里面的文件有了大致的了解,那么举例说明,如果我们要做一个基于以上ROM的定制包,那么大概要进行两种操作1.添加目录里的APK程序到ROM的system/app里2.从ROM里删除APK程序(即瘦身)3.显示进程添加目录的语句为copy_dir PACKAGE:定制包路径手机内存路径删除程序的语句为delete 手机内存路径显示进程语句为show_progress脚本文件可用TXT、记事本等程序作为打开方式并编辑保存作为初学者只需要掌握以下范例即可show_progress 0.1 0delete SYSTEM:app/DivXRegCode.odexdelete SYSTEM:app/YouTube.apkcopy_dir PACKAGE:system SYSTEM:show_progress 0.1 10其中对前后两个show_progress语句不需要理解,看中间的,第一句是删除system/spp文件夹内的DivXRegCode.odex文件,第二句是删除system/spp文件夹内的YouTube.apk文件,第三句是复制(同时会覆盖已存在的文件)定制包中的system文件夹到手机内存的system文件夹。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android覆盖升级以及apk签名的实现思路
1、为什么要签名
1) 发送者的身份认证
由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包不被替换
2) 保证信息传输的完整性
签名对于包中的每个文件进行处理,以此确保包中内容不被替换3) 防止交易中的抵赖发生,Market对软件的要求
2. 签名的说明
1) 所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
2) Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
3) 如果要正式发布一个Android应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布
4) 数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。

如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能
5) 签名后需使用zipalign优化程序
6) Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序
3. 签名的方法
1) 用eclipse插件方式签名
a) 调试签名
eclipse插件默认赋予程序一个DEBUG权限的签名,此签名的程序不能发布到market上,此签名有效期为一年,如果过期则导致你无法生成apk文件,此时你只要删除debug keystore即可,系统又会为你生成有效期为一年的新签名
b) 开发者生成密钥并签名
右键点击项目名,在菜单中选择Android Tools,然后选择Export Signed Application Package…,即可通过eclipse自定义证书并签名
c) 开发者导出未签名的包
右键点击项目名,在菜单中选择Android Tools,然后选择Export Signed Application Package…,即可导出未签名的包,之后可通过命令行方式签名
2) 用命令行方式签名
使用标准的java工具keytool和jarsigner来生成证书和给程序签名
a) 生成签名
$ keytool -genkey -keystore keyfile -keyalg RSA -validity 10000 -alias yan
注:validity为天数,keyfile为生成key存放的文件,yan为私钥,RSA为指定的加密算法(可用RSA或DSA)
b) 为apk文件签名
$ jarsigner -verbose -keystore keyfile -signedjar signed.apk base.apk yan
注:keyfile为生成key存放的文件,signed.apk为签名后的apk,base.apk 为未签名的apk,yan为私钥
c) 看某个apk是否经过了签名
$ jarsigner -verify my_application.apk
d) 优化(签名后需要做对齐优化处理)
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
3) 在源码中编译的签名
a) 使用源码中的默认签名
在源码中编译一般都使用默认签名的,在某源码目录中用运行
$ mm showcommands能看到签名命令
Android提供了签名的程序signapk.jar,用法如下:
$ signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar
*.x509.pem为x509格式公钥,pk8为私钥
build/target/product/security目录中有四组默认签名可选:testkey platform shared media(具体见README.txt),应用程序中Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.
b) 在源码中自签名
Android提供了一个脚本mkkey.sh (build/target/product/security/mkkey.sh),用于生成密钥,生成后在应用程序中通过Android.mk中的LOCAL_CERTIFICATE字段指名用哪个签名
c) mkkey.sh介绍
i. 生成公钥
openssl genrsa -3 -out testkey.pem 2048
其中-3是算法的参数,2048是密钥长度,testkey.pem是输出的文件
ii. 转成x509格式(含作者有效期等)
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 -subj ‘/C=US/ST=California/L=MountainView/O=Android/OU=A ndroid/CN=Android/emailAddress=android@’
iii. 生成私钥
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
把的格式转换成PKCS #8,这里指定了-nocryp,表示不加密,所以签名时不用输入密码
4. 签名的相关文件
1) apk包中签名相关的文件在meta_INF目录下
CERT.SF:生成每个文件相对的密钥
MANIFEST.MF:数字签名信息
xxx.SF:这是JAR文件的签名文件,占位符xxx标识了签名者xxx.DSA:对输出文件的签名和公钥
2) 相关源码
development/tools/jarutils/src/com.anroid.jarutils/SignedJ arBuilder.java
frameworks/base/services/java/com/android/server/Packa geManagerService.java
frameworks/base/core/java/android/content/pm/Package Manager.java
frameworks/base/cmds/pm/src/com/android/commands/p m/Pm.java
dalvik/libcore/security/src/main/java/java/security/Sign* build/target/product/security/platform.*
build/tools/signapk/*
5. 签名的相关问题
一般在安装时提示出错:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
1) 两个应用,名字相同,签名不同
2) 升级时前一版本签名,后一版本没签名
3) 升级时前一版本为DEBUG签名,后一个为自定义签名
4) 升级时前一版本为Android源码中的签
很多Android开发者不明白APK签名有什么作用。

其实APK签名用处主要有两种:
1. 使用特殊的key签名可以获取到一些不同的权限。

2. APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本,这样可以防止你已安装的应用被恶意的第三方覆盖或替换掉。

目前google在Android系统方面的态度和策略也都是非盈利性
质的,和Symbian的签名有本质的区别,而我们使用Eclipse+ADT 插件从开发环境安装到手机中的APK文件已经包含了ADT插件的Debug签名文件,所以没有安装,但是最终发行的版本需要自己的key去签名。

相关文档
最新文档