没有合适的资源?快使用搜索试试~ 我知道了~
Android APK 签名比对.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 110 浏览量
2022-07-04
20:07:17
上传
评论
收藏 14KB DOC 举报
温馨提示
试读
11页
Android APK 签名比对
资源推荐
资源详情
资源评论
http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html
发布过 Android 应用的朋友们应该都知道,Android APK 的发布是需要签名的。签名机制在 Android 应用
和框架中有着十分重要的作用。
例如,Android 系统禁止更新安装签名不一致的 APK;如果应用需要使用 system 权限,必须保证 APK 签名
与 Framework 签名一致,等等。在 《APK Crack 》 一文中,我们了解到,要破解一个 APK,必然需
要重新对 APK 进行签名。而这个签名,一般情况无法再与 APK 原先的签名保持一致。(除非 APK 原作者的私
钥泄漏,那已经是另一个层次的软件安全问题了。)
简单地说,签名机制标明了 APK 的发行机构。因此,站在软件安全的角度,我们就可以通过比对 APK 的签名
情况,判断此 APK “ ” “ ” 是否由 官方 发行,而不是被破解篡改过重新签名打包的 盗版软件 。
Android 签名机制
为了说明 APK 签名比对对软件安全的有效性,我们有必要了解一下 Android APK 的签名机制。为了更
易于大家理解,我们从 Auto- S ign 工具的一条批处理命令说起。
在 《APK Crack 》 一文中,我们了解到,要签名一个没有签名过的 APK ,可以使用一个叫作 Auto-
sign 的工具。 Auto-sign 工具实际运行的是一个叫做 Sign.bat 的批处理命令。用文本编辑器打开这个
批处理文件,我们可以发现,实现签名功能的命令主要是这一行命令:
java
-
jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
这条命令的意义是:通过 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 。
对比一个没有签名的 APK 和一个签名好的 APK,我们会发现,签名好的 APK 包中多了一个叫做 META-INF
的文件夹。里面有三个文件,分别名为 MANIFEST.MF 、 CERT.SF 和 CERT.RSA 。signapk.jar 就是
生成了这几个文件(其他文件没有任何改变。因此我们可以很容易去掉原有签名信息)。
通过阅读 signapk 源码,我们可以理清签名 APK 包的整个过程。
1 、 生成 MANIFEST.MF 文件:
程序遍历 update.apk 包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成 SHA1 的数字签
名信息,再用 Base64 进行编码。具体代码见这个方法:
private
static
Manifest addDigestsToManifest(JarFile jar)
关键代码如下:
1
for
(JarEntry entry: byName.values()) {
2
String name
=
entry.getName();
3
if
(
!
entry.isDirectory()
&;&;
!
name.equals(JarFile.MANIFEST_NAME)
&;&;
4
!
name.equals(CERT_SF_NAME)
&;&;
!
name.equals(CERT_RSA_NAME)
&;&;
5
(stripPattern
==
null
||!
stripPattern.matcher(name).matches())) {
6
InputStream data
=
jar.getInputStream(entry);
7
while
((num
=
data.read(buffer))
>;
0
) {
8
md.update(buffer,
0
, num);
9
}
10
Attributes attr
=
null
;
11
if
(input
!=
null
) attr
=
input.getAttributes(name);
12
attr
=
attr
!=
null
?
new
Attributes(attr) :
new
Attributes();
13
attr.putValue(
";
SHA1-Digest
";
, base64.encode(md.digest()));
14
output.getEntries().put(name, attr);
15
}
16
}
之后将生成的签名写入 MANIFEST.MF 文件。关键代码如下:
1
Manifest manifest
=
addDigestsToManifest(inputJar);
2
je
=
new
JarEntry(JarFile.MANIFEST_NAME);
3
je.setTime(timestamp);
4
outputJar.putNextEntry(je);
5
manifest.write(outputJar);
这里简单介绍下 SHA1 数字签名。简 单地说,它就是一种安全哈希算法,类似于 MD5 算法。它把任意长
“ ” 度的输入,通过散列算法变成固定长度的输出(这里我们称作 摘要信息 )。你不能仅通过这 个摘要信息复
剩余10页未读,继续阅读
资源评论
老帽爬新坡
- 粉丝: 79
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功