APK重新签名方法
Android使用SHA1-RSA算法进行签名。可通过eclipse插件进行,可以通过keytool和jarsigner 用命令行执行,也可以在源码下进行签名。
第一种:通过使用eclipse进行签名。
2011-5-23 22:31 上传
以我这个应用为例,右键项目,找到export
2011-5-23 22:31 上传
下一步
2011-5-23 22:31 上传
此处选择你要为哪个应用创建签名
继续下一步
2011-5-23 22:31 上传
选择第二个创建一个新的密钥,Location表示在本地计算机哪个位置放置这个密钥,后面是密码,自己设一个
继续下一步
2011-5-23 22:31 上传
里面的“中科院”是乱填的,其它的自己看吧,继续下一步
2011-5-23 22:31 上传
然后Finish就Ok了
然后在你的D盘里会有一个ResCat.key和一个ResCat.apk的文件
第二种:通过keytool和jarsigner 用命令行执行。
apk签名首先要有一个keystore的签名用的文件。
keystore是由jdk自带的工具keytool生成的具体方式如下:
开始-〉运行->cmd->cd到你安装的jdk下的bin目录下这里是C:Program Files (x86)Javajdk1.60_21in
然后输入keytool -genkey -alias chenAndroid.keystore -keyalg RSA -validity 20000 -keystore chenAndroid.keystore
-alias后跟的是别名这里是chenAndroid.keystore
-keyalg是加密方式这里是RSA
-validity是有效期 这里是20000天
-keystore就是要生成的keystore的名称,这里是chenAndroid.keystore
然后按回车首先提示输入密码:这个在答名时要用的要记住了哦
然后会确认你的密码
之后会依次叫你输入相关信息如姓名,组织单位等
之后就是输入chenAndroid.keystore主密码(如果和keystore密码相同,按回车)我在这里设和keystore相同,之后你就会在bin目录下找到生成的chenAndroid.store
2012-7-4 11:08 上传
好了keystore生成了,现在可以进行签名了现在把你要进行签名的apk放到C:Program Files (x86)Javajdk1.6.0_21in目录下,记得一定要将要签名的apk放到bin目录下,然后利用jdk提供的工具jarsigner.exe进行签名
jarsigner -verbose -keystore chenAndroid.keystore -signedjar 111.apk HengAnProject2.1.apk chenAndroid.keystore
-keystore:keystore 的名称
111.apk 是签完名后的APK
HengAnProject2.1.apk 是签名前的apk
然后按回车:会要求输入刚才设置的密码,输入后按回车就开始签名了。
第三种:在源码下进行签名。
生成密钥对方法:
Android源码目录development\tools 下有make_key脚本:
生成公钥:openssl genrsa -3 -outtestkey.pem 2048
转换成X509证书格式: openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000-subj ‘xx’
生成私钥:openssl pkcs8 -in testkey.pem-topk8 -outform DER -out testkey.pk8 –nocrypt
具体参数可以在网上查看。目前我们使用默认的testkey密钥对。
对APK签名命令:
signapk publickey.x509[.pem]privatekey.pk8 input.apk output.apk
对recovery 签名命令:
signapk –w publickey.x509[.pem]privatekey.pk8 input.zip output.zip
- w参数表示对整个文件进行签名,目前看只是在制作recovery升级包时使用。
签名后,输出文件的meta_inf目录下生长如下文件:
MANIFEST.MF:对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息
CERT.SF:对Manifest文件,使用SHA1-RSA算法,用私钥进行签名。
CERT.RSA:CERT.RSA文件中保存了公钥、所采用的加密算法等信息。
怎样验证签名
APK验证:
安装apk时,通过CERT.RSA查找公钥和算法,并对CERT.SF进行解密和签名验证,确认MANIFEST.MF,最终对每个文件签名校验。
升级时,android也会进行签名验证。如果遇到以下情况,都不能完成升级:
1) 两个应用,名字相同,签名不同
2) 升级时前一版本签名,后一版本没签名。
3) 升级时前一版本为DEBUG签名,后一个为自定义签名。
4) 升级时前一版本为Android源码中的签名,后一个为DEBUG签名或自定义签名。
5) 安装未签名的程序。
6) 安装升级已过有效期的程序。
以上可以看到,随便更换密钥对后签名生成的apk也是可以安装在任何平台的。因为公钥是放在apk里的。
RECOVERY:
Recovery公钥是固定在代码里面。并没有采用CERT.RSA里面公钥。目前几乎所有的手机平台都是用testkey。固定公钥目的可能是为了确保其它平台的升级包不能被升级。比如我们统一更换了一个密钥对,那么recovery里面固定的公钥更改后,用testkey做成的升级包是无法升级成功的。
同时recovery只是对整个升级压缩文件进行签名校验(前面说过recovery签名使用的是-w)。
Recovery 代码里面使用的公钥是按照rsapublickey 数据结构存储。这个数据是通过dumppublickey工具从制作出来的x509证书文件中获得。Dumppublickey代码在网上可以查找到。
先进入 Android 源码目录 F:\android_source\build\target\product\security ,具体机器目录自己选择。找到 【platform.pk8】和【platform.x509.pem】这两个文件,这里为了方便将它们复制到根目录,如:F:\sign 文件夹内,本来下一步就是需要打包jar 包了,不过里我们在android系统的源码内找到 out 编绎目录下
signApk.jar 这个包,可以自行打jar 包或者下载我这个jar 包都是可以的,下载地址: signapk.rar (8.78 KB, 下载次数: 17)
2011-11-26 09:55 上传
点击文件名下载附件
下载积分: 下载豆 -2
请自行将后缀名改为.jar 格式,把此jar 包放于F:\sign 文件内,打开dos 操作界面,定们到F:\sign,如下:
2011-11-26 09:55 上传
,接着输入如下命令:java -jar signapk.jar platform.x509.pem platform.pk8 test.apk testnew.apk ,在dos 命令名如下图:
2011-11-26 09:55 上传
,其中set.apk 是指我们要签名的原始文件apk,后面setnew.apk 是指我们签名后输出的apk文件的名称
Tip:在签名的时候必须将set.apk事先用rar 文件打开,进入META-INF目录下,将CERT.SF和CERT.RSA这两个文件删除掉,再执行如上操作。到了这一步,程序己经可以正常安装了。
文档二:
1、重新签名需要删除apk包中的签名文件,META-INF
2、在命令中输入以下内容(jdk1.6):
>jarsigner -keystore eclipse默认的debug.keystore路径 -storepass android -keypass android 需要重新签名apk的路径 androiddebugkey
> zipalign 4 需要重新签名apk的路径 重新签名后apk的路径
3、jdk1.7需要加一行代码:(命令之间有空格)
4、>jarsigner -digestalg SHA1 -sigalg MD5withRSA -keystore E:\ME\SOFT\android-sdk-windows\.android\debug.keystore -storepass android -keypass android E:\ME\Sign\a.apk androiddebugkey
> zipalign 4 E:\ME\Sign\a.apk E:\ME\Sign\a_sign.apk
1、eclipse默认的debug.keystore路径:
我的路径:E:\ME\SOFT\android-sdk-windows\.android\debug.keystore
2、需要重新签名apk的路径:
我的路径:E:\ME\Sign\a.apk
3、重新签名后apk的路径:
E:\ME\Sign\a.apk E:\ME\Sign\a_sign.apk
我的完整输入:
首先输入:
jarsigner -keystore E:\ME\SOFT\android-sdk-windows\.android\debug.keystore -storepass android -keypass android E:\ME\Sign\a.apk androiddebugkey
然后输入:
zipalign 4 E:\ME\Sign\a.apk E:\ME\Sign\a_sign.apk
3、好了,重新签名完成,安装后,就可以不依赖程序进行测试了。
重新签名只要以下两句命令行就可以
我的完整输入:
首先输入:
jarsigner -keystore E:\ME\SOFT\android-sdk-windows\.android\debug.keystore -storepass android -keypass android E:\ME\Sign\a.apk androiddebugkey
然后输入:
zipalign 4 E:\ME\Sign\a.apk E:\ME\Sign\a_sign.apk
APK重新签名方法的更多相关文章
- apk重签名方法
转载(http://www.51testing.com/?uid-115892-action-viewspace-itemid-223023) 1. 生成Android APK包签名证书 1 ...
- Android测试之 APK重签名方法
方法一:命令行重签名 D:\>keytool -helpkeytool 用法: -certreq [-v] [-protected] [-alias <别名>] [-sigalg & ...
- Android APK生成证书并签名方法
Android APK生成证书并签名方法 android cordova keystore android证书签名 阅读:925 时间:2018年09月20日 Android开发者可能对此很熟悉.使用 ...
- Android apk签名方法介绍
还望支持个人博客站:http://www.enjoytoday.cn 参考博客:http://www.enjoytoday.cn/posts/203 为什么要签名 在介绍签名方法之前,首先我们来了解下 ...
- Apk去掉签名以及重新签名的方法
Android开发中很重要的一部就是用自己的密钥给Apk文件签名,不经过签名的Apk文件一般是无法安装的,就算装了最后也是失败. 网上流传的"勾选允许安装未知来源的应用"其实跟签不 ...
- 读取Android APK文件签名的方法
在微信开放平台等申请API key 和secret时经常要用到apk文件签名,那么如何读取呢? 下面贴一下相关读取源码: 一共两个文件MainActivity和MD5, package com.lcg ...
- Android之APK文件签名——keytool和jarsigner
一.生成密钥库将位置定位在jdk的bin文件中,输入以下命名行:keytool -genkey -alias ChangeBackgroundWidget.keystore -keyalg RSA - ...
- apk文件签名绕过
声明: 1.本文转载自:http://www.2cto.com/Article/201311/256406.html,为了留作日后参考上传博客 2.如有转载请复试上面连接,尊重原创 apk文件签名绕过 ...
- 如何给apk文件签名
1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...
随机推荐
- 【实验室笔记】C#以本地时间创建txt文件
前段时间做的一个小项目,要求上位机在打开时候,以打开软件的系统时间的建立一个txt文件来存储下位机发送来的数据. 在第一版上位机上,取名的办法太弱了,先是读取系统时间,然后截取字符串,太笨拙.昨天,查 ...
- GitHub常见错误解决办法
如果輸入$ git remote add origin git@github.com:djqiang(github帳號名)/gitdemo(項目名).git 提示出錯信息:fatal: remote ...
- 关于ajax后台success传来json数据的问题
最近在使用JQuery的ajax方法时,需要返回的数据为json数据,在success返回中数据处理会根据返回方式不同会采用不同的方式来生成json数据.在$.ajax方法中应该是如何来处理的,简单进 ...
- linux命令随记
1.当再Hadoop平台上跑代码的时候,可能会发现有些job是需要被kill重新跑的,此刻,如果一个一个手动去删除会很缓慢,此刻需要使用一个简单的脚本来实现自动全部删除操作: for i in `ha ...
- java中字符串的操作
//创建一个字符数组 char[] charArr = {'a','b','c','d','e','f','g'}; //创建一个字符串 String str = new String(charArr ...
- grunt学习随笔
1 grunt 安装 全局安装 npm install -g grunt-cli 2 配置好package.json 和 Gruntfile 文件,这两个文件必须位于项目根目录下. 2.1packa ...
- mysql表设计---时间类型
mysql 时间格式的区别 datetime 日期 +时间timestamp 时间戳 格式都是一样YYYY-MM-DD HH:MM:SS int(12)型存储php的time()时间戳,格式10位14 ...
- 自定义MVC框架(二) -基于XML文件
1.oracle的脚本 create table STUDENT ( sid NUMBER primary key, sname ), age NUMBER, pwd ) ) create seque ...
- hdu 1210 Eddy's 洗牌问题
Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n.这也是 ...
- CentOS系统更换软件安装源aliyun的
CentOS系统更换软件安装源第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS ...