安卓生成签名文件时密钥口令和cmd 输入密钥库口令令相同吗

查看: 3860|回复: 3
【Android】安卓签名机制
阅读权限30
【Android签名机制】
feiyangxiaomi的专栏
1.android为什么要签名& & 所有的Android应用程序都要求开发人员用一个证书进行数字签名,anroid系统不会安装没有进行签名的由于程序。平时我们的程序可以在模拟器上安装并运行,是因为在应用程序开发期间,由于是以Debug面试进行编译的,因此ADT根据会自动用默认的密钥和证书来进行签名,而在以发布模式编译时,apk文件就不会得到自动签名,这样就需要进行手工签名。
& &给apk签名可以带来以下好处:
& && &&&1. 应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
& && &&&2.应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块。
& && &&&3.代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。
不同的应用程序之间,想共享数据,或者共享代码,那么要让他们运行在同一个进程中,而且要让他们用相同的证书签名。
2.签名的方法& & 参考:签名的方法 ,这里就不详述签名的方法
3.签名机制的原理
3.1基本知识
消息摘要 -Message Digest
简称摘要,请看英文翻译,是摘要,不是签名,网上几乎所有APK签名分析的文章都混淆了这两个概念。简单的说消息摘要就是在消息数据上,执行一个单向的Hash函数,生成一个固定长度的Hash值,这个Hash值即是消息摘要也称为数字指纹,消息摘要有以下特点:
1. 通过摘要无法推算得出消息本身
2. 如果修改了消息,那么摘要一定会变化(实际上,由于长明文生成短摘要的Hash必然会产生碰撞),所以这句话并不准确,我们可以改为:很难找到一种模式,修改了消息,而它的摘要不会变化(抗冲突性)。
消息摘要的这种特性,很适合来验证数据的完整性,比如在网络传输过程中下载一个大文件BigFile,我们会同时从网络下载BigFile和BigFile.md5,BigFile.md5保存BigFile的摘要,我们在本地生成BigFile的消息摘要,和BigFile.md5比较,如果内容相同,则表示下载过程正确。
注意,消息摘要只能保证消息的完整性,并不能保证消息的不可篡改性。
MD5/SHA-0 SHA-1
这些都是摘要生成算法,和签名没有关系。如果非要说他们和签名有关系,那就是签名是要借助于摘要技术。
数字签名 - Signature
数字签名,百度百科对数字签名有非常清楚的介绍。数字签名就是信息的发送者用自己的私钥对消息摘要加密产生一个字符串,加密算法确保别人无法伪造生成这段字符串,这段数字串也是对信息的发送者发送信息真实性的一个有效证明。数字签名是 非对称密钥加密技术 + 数字摘要技术 的结合。
数字签名技术是将信息摘要用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的信息摘要,然后接收者用相同的Hash函数对收到的原文产生一个信息摘要,与解密的信息摘要做比对。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改;不同则说明信息被修改过,因此数字签名能保证信息的完整性。并且由于只有发送者才有加密摘要的私钥,所以我们可以确定信息一定是发送者发送的。
数字证书 - Certificate
数字证书是一个经证书授权 中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。CERT.RSA包含了一个数字签名以及一个数字证书。
需要注意的是Android APK中的CERT.RSA证书是自签名的,并不需要这个证书是第三方权威机构发布或者认证的,用户可以在本地机器自行生成这个自签名证书。
3.2 Android签名分析我们将DF_SDM_1008.apk(自己任选)文件改为DF_SDM_1008.zip文件,打开DF_SDM_1008.zip文件,如图1所示。
1.png (19.22 KB, 下载次数: 0)
11:33 上传
图1 DF_SDM_1008.zip文件
<font color="#. META-INF\ (注:签名后的信息);
<font color="#. res\ (注:存放资源文件的目录) ;
<font color="#. AndroidManifest.xml (注:程序全局配置文件) ;
<font color="#. classes.dex (注:Dalvik字节码);
<font color="#. resources.arsc (注:编译后的二进制资源文件)。
接下来针对META-INF\文件进行分析。
3.3META-INF\文件META-INF\文件中有三个文件,分别是MANIFEST.MF, CERT.SF, CERT.RSA,如图2所示。
2.png (12.97 KB, 下载次数: 0)
11:34 上传
现在有一个问题就是,三个文件怎么产生的的——签名产生的,第二个问题签名是怎么做的呢?这里Android提供了APK的签名工具signapk,通过xxx.keystore(java的密钥库、用来进行通信加密用的、比如数字签名。keystore就是用来保存密钥对的,比如公钥和私钥)提供的信息,对APK进行签名,生成的META-INF\文件,参考文章4。
1.MANIFEST.MF文件先看一下源代码:
[Asm] 纯文本查看 复制代码
// MANIFEST.MF
Manifest manifest = addDigestsToManifest(inputJar);
je = new JarEntry(JarFile.MANIFEST_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
manifest.write(outputJar);
[Asm] 纯文本查看 复制代码
/** Add the SHA1 of every file to the manifest, creating it if necessary. */
private static Manifest addDigestsToManifest(JarFile jar)
throws IOException, GeneralSecurityException {
Manifest input = jar.getManifest();
Manifest output = new Manifest();
Attributes main = output.getMainAttributes();
if (input != null) {
main.putAll(input.getMainAttributes());
main.putValue(&Manifest-Version&, &1.0&);
main.putValue(&Created-By&, &1.0 (Android SignApk)&);
&span style=&white-space:pre&&
&/span&......
for (JarEntry entry: byName.values()) {
String name = entry.getName();
if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&
!name.equals(CERT_SF_NAME) && !name.equals(CERT_RSA_NAME) &&
(stripPattern == null ||
!stripPattern.matcher(name).matches())) {
InputStream data = jar.getInputStream(entry);
while ((num = data.read(buffer)) & 0) {
md.update(buffer, 0, num);
Attributes attr =
if (input != null) attr = input.getAttributes(name);
attr = attr != null ? new Attributes(attr) : new Attributes();
attr.putValue(&SHA1-Digest&, base64.encode(md.digest()));
output.getEntries().put(name, attr);
遍历APK包中的每一个文件,利用SHA1算法生成这些文件的摘要信息。
验证是所有文件使用的SHA1算法:
1.安装hashTab工具
2.打开MANIFEST.MF文件
举个例子:
[Asm] 纯文本查看 复制代码
Name: AndroidManifest.xml
SHA1-Digest: Zovq4AVMcCjFkILZLlHgmeOLvnU=
其中找到文件中的AndroidManifest.xml文件,查看其对应的hash值,如图3所示。
3.png (32.13 KB, 下载次数: 0)
11:36 上传
这里取出16进制的668BEAE082D92E51E099E38BBE75,将16进制通过在线转码网站:hex to base64转化为对应的base64编码,看见“Zovq4AVMcCjFkILZLlHgmeOLvnU=”与记录信息相对的。
4.png (16.41 KB, 下载次数: 0)
11:36 上传
2.CERT.SF文件先看一下源码:
[Asm] 纯文本查看 复制代码// CERT.SF
Signature signature = Signature.getInstance(&SHA1withRSA&);
signature.initSign(privateKey);
je = new JarEntry(CERT_SF_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
writeSignatureFile(manifest,
new SignatureOutputStream(outputJar, signature));
[Asm] 纯文本查看 复制代码
/** Write a .SF file with a digest of the specified manifest. */
private static void writeSignatureFile(Manifest manifest, SignatureOutputStream out)
throws IOException, GeneralSecurityException {
Manifest sf = new Manifest();
Attributes main = sf.getMainAttributes();
main.putValue(&Signature-Version&, &1.0&);
main.putValue(&Created-By&, &1.0 (Android SignApk)&);
BASE64Encoder base64 = new BASE64Encoder();
MessageDigest md = MessageDigest.getInstance(&SHA1&);
PrintStream print = new PrintStream(
new DigestOutputStream(new ByteArrayOutputStream(), md),
true, &UTF-8&);
// Digest of the entire manifest
manifest.write(print);
print.flush();
main.putValue(&SHA1-Digest-Manifest&, base64.encode(md.digest()));
Map&String, Attributes& entries = manifest.getEntries();
for (Map.Entry&String, Attributes& entry : entries.entrySet()) {
// Digest of the manifest stanza for this entry.
print.print(&Name: & + entry.getKey() + &\r\n&);
for (Map.Entry&Object, Object& att : entry.getValue().entrySet()) {
print.print(att.getKey() + &: & + att.getValue() + &\r\n&);
print.print(&\r\n&);
print.flush();
Attributes sfAttr = new Attributes();
sfAttr.putValue(&SHA1-Digest&, base64.encode(md.digest()));
sf.getEntries().put(entry.getKey(), sfAttr);
&span style=&white-space:pre&&
&/span&//签名信息在上面并没有使用的到
sf.write(out);
// A bug in the java.util.jar implementation of Android platforms
// up to version 1.6 will cause a spurious IOException to be thrown
// if the length of the signature file is a multiple of 1024 bytes.
// As a workaround, add an extra CRLF in this case.
if ((out.size() % 1024) == 0) {
out.write('\r');
out.write('\n');
虽然writeSignatureFile字面上看起来是写签名文件,但是CERT.SF的生成和私钥没有一分钱的关系,实际上也不应该有一分钱的关系,这个文件自然不保存任何签名内容。CERT.SF中保存的是MANIFEST.MF的摘要值(第一项),
[Asm] 纯文本查看 复制代码Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA1-Digest-Manifest: nGpBbfOirA4fsY0pn0dBONop5bQ=
以及MANIFEST.MF中每一个摘要项的摘要值。我也没搞清楚为什么要引入CERT.SF,实际上我也觉得签名完全可以用MANIFEST.MF生成。
验证所有的摘要都是MANIFEST.MF条目:
首先:对应MANIFEST.MF文件,对应的消息摘要为SHA1-Digest-Manifest: nGpBbfOirA4fsY0pn0dBONop5bQ=,对应的实际消息摘要如图4所示。
5.png (5.38 KB, 下载次数: 0)
11:39 上传
6.png (5.01 KB, 下载次数: 0)
11:39 上传
图4 MANIFEST.MF消息摘要和对应的base64编码
其次:验证条目的消息摘要,根据条目消息摘要的算法知道内容格式为SHA1(&Name: filename&+CR+LF+&SHA1-Digest: &+SHA1(file_content)+CR+LF+CR+LF)
我先把CERT.SF中的一项取出来,然后验证,取出
[Asm] 纯文本查看 复制代码
Name: AndroidManifest.xml
SHA1-Digest: PJblxooLyYkHHlr/0lKZkk2DkM0=
在将MANIFEST.MF条目取出,保存为“新建文本文档.txt”,查看对应的消息摘要,并将其转换为base64编码,如图5所示。
7.png (32.53 KB, 下载次数: 0)
11:41 上传
8.png (5.9 KB, 下载次数: 0)
11:41 上传
图5 新建文本文档.txt的消息摘要和对应的base64编码
这里完成了对CERT.SF的验证。
3.CERT.RSA文件[Asm] 纯文本查看 复制代码代码为:
// CERT.RSA
je = new JarEntry(CERT_RSA_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
writeSignatureBlock(signature, publicKey, outputJar);
[Asm] 纯文本查看 复制代码
/** Write a .RSA file with a digital signature. */
private static void writeSignatureBlock(
Signature signature, X509Certificate publicKey, OutputStream out)
throws IOException, GeneralSecurityException {
SignerInfo signerInfo = new SignerInfo(
new X500Name(publicKey.getIssuerX500Principal().getName()),
publicKey.getSerialNumber(),
AlgorithmId.get(&SHA1&),
AlgorithmId.get(&RSA&),
signature.sign());
PKCS7 pkcs7 = new PKCS7(
new AlgorithmId[] { AlgorithmId.get(&SHA1&) },
new ContentInfo(ContentInfo.DATA_OID, null),
new X509Certificate[] { publicKey },
new SignerInfo[] { signerInfo });
pkcs7.encodeSignedData(out);
这个文件保存了签名和公钥证书。签名的生成一定会有私钥参与,签名用到的信息摘要就是CERT.SF内容。
signature这个数据会作为签名用到的摘要,writeSignatureBlock函数用privateKey对signature加密生成签名,然后把签名和公钥证书一起保存到CERT.RSA中。
最终保存在CERT.RSA中的是CERT.SF的数字签名,签名使用privateKey生成的,签名算法会在publicKey中定义。同时还会把publicKey存放在CERT.RSA中,也就是说CERT.RSA包含了签名和签名用到的证书。并且要求这个证书是自签名的。
提取CERT.RSA信息:
参考有RSA公钥信息、subject信息、对应的签名信息。
[Asm] 纯文本查看 复制代码
Certificate:
Version: 3 (0x2)
Serial Number:
(0x4c69568b)
Signature Algorithm: sha1WithRSAEncryption
Issuer: CN=Michael Liu
Not Before: Aug 16 15:17:31 2010 GMT
Not After : Aug 10 15:17:31 2035 GMT
Subject: CN=Michael Liu
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:8d:04:84:a2:1e:c6:56:39:f2:cd:a6:f0:48:a5:
f7:5e:71:8f:e1:a8:af:a7:dc:66:92:a2:b9:cf:da:
0f:32:42:ce:83:fe:bc:e1:4f:0a:fd:d9:a8:b3:73:
f4:ff:97:15:17:87:d6:d0:3c:da:01:fc:11:40:7d:
04:da:31:cc:cd:da:d0:e7:7b:e3:c1:84:30:9f:21:
93:95:20:48:b1:2d:24:02:d2:b9:3c:87:0d:fa:b8:
e1:b1:45:f4:8d:90:0a:3b:9d:d8:8a:9a:96:d1:51:
23:0e:8e:c4:09:68:7d:95:be:c6:42:e9:54:a1:5c:
5d:3f:25:d8:5c:c3:42:73:21
Exponent: 601)
Signature Algorithm: sha1WithRSAEncryption
78:3c:6b:ef:71:70:55:68:28:80:4d:f8:b5:cd:83:a9:01:21:
2a:c1:e4:96:ad:bc:5f:67:0c:cd:c3:34:51:6d:63:90:a9:f9:
d5:5e:c7:ef:34:43:86:7d:68:e1:99:87:92:86:34:91:6d:67:
6d:b2:22:e9:5e:28:aa:e8:05:52:04:6e:4e:d4:7f:0f:b0:d6:
28:f5:2b:11:38:d5:15:cb:e3:e4:c9:99:23:c1:84:4f:ce:69:
e9:b1:59:7b:8e:30:01:1c:e1:92:ee:0d:54:61:29:f5:8e:9e:
42:72:26:2b:aa:c7:af:d9:c9:d1:85:95:8e:4c:8d:5c:77:c5:
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限25
效果呢?& && && && && &
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
相对而言,我比较关心怎么 Make fake signature 。
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
大家好,新人一枚不懂多关照来自: Android客户端
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
免责声明:吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
( 京ICP备号 | 京公网安备 87号 )
Powered by Discuz!
Comsenz Inc.找到问题的关键哈希签名的应用程序-安卓android,密钥库keystore,密钥工具keytool,hashtag-CodeGo.net
找到问题的关键哈希签名的应用程序
我已经签我的应用程序,并远销到我的桌面上的文件夹这个文件夹中名为应用程序是我的应用程序本身和密钥库。我怎么觉得,我可以复制到facebook的开发者页面的密钥散列。我已经openssl的安装,但不能似乎生成密钥散列香港专业教育学院尝试在堆栈许多其他的线程,并没有有帮助,谢谢
本文地址 :CodeGo.net/292836/
-------------------------------------------------------------------------------------------------------------------------
1. 你应该知道哪里是你的keystore文件(是“C:\\用户\\ Selvin \\桌面\\ selvin.kp”)
你应该知道你的别名在密钥库(就是“selvin”)
你应该知道路径keytool将(“C:\\ Program Files文件\\的Java \\ jdk1.6.0_22 \\ BIN \\ keytool.exe”)
你应该没什么两样路径openssl的(“C:\\ OpenSSL的Win32的\\ BIN \\的openssl.exe”)
你应该知道密码,密钥库*嘻嘻
比你应该拨打:
“C:\\ Program Files文件\\的Java \\ jdk1.6.0_22 \\ BIN \\ keytool.exe”-exportcert别名selvin-密钥库C:\\用户\\ selvin \\桌面\\ selvin.kp|C:\\的OpenSSL的Win32 \\ BIN \\ openssl的SHA1二进制|C:\\ OpenSSL的Win32的\\ BIN \\ openssl的base64的
(替换我的路径和别名适当的)
输入keystore密码:&-它应该会出现
输入您的密码....
你应该得到水木清华这样的“NfhDlIH7XWJzUZRjL +pZySrMX1Q=”
好:(NfgDlIG7XWJzUZRUL +bZySrMX1Q=&-这个散列是坏的......或者你有这么幸运,你的关键所做的colision的错误中:keytool错误:java.lang.Exception的:别名不存在)
如果哈希不工作:
优先次调用“C:\\ Program Files文件\\的Java \\ jdk1.6.0_22 \\ BIN \\ keytool.exe”-exportcert别名selvin-密钥库C:\\用户\\ selvin \\桌面\\ selvin.kp
输入密码和读取错误
如果您不您的别名(“的keytool错误:java.lang.Exception的:别名不存在”)selvinn显示错误
“C:\\ Program Files文件\\的Java \\ jdk1.6.0_22 \\ BIN \\ keytool.exe”列表-密钥库C:\\用户\\ selvin \\桌面\\ selvin.kp
为您的所有条目/别名列表
第二个编辑
对于那些还在挣扎我发现,当遵循这些步骤正确地肯定会工作,但他们可以是相当具有挑战性的,以得到正确的优先,其实我刚才发现的base64当别名为处理指纹的转换&#39;不工作(散列得到截断的原因)。我已经写了拉大部分指令的批处理文件在一起 CodeGo.net,所以我不排除有问题的。
然而,基本上大多数人摔倒在openssl的阶段(或者找不到它,不知道它是如何,或Windowspipeline不正确链的输出从SHA1出口到base64的转换输入)。
为了解决这个问题你是这可能是更容易轨迹和了解。从本质上说facebook的API,希望是SHA1的Base64表示(编码)指纹您的APK。要做到这一点,你可以只列出密钥库:
"C:\Program Files\Java\JRE6\Bin\keytool.exe" -list -v -keystore "Path-to-your-keystore" -storepass "KeystorePassword" & somefile.txt
你需要根据你自己的设置来改变路径的keytool的可执行文件,并与您的密钥库的路径和密码替换“路径到你,密钥库”和“KeystorePassword”!其结果应该是建立在当前文件夹,然后可以在任何文本编辑器打开文件“中的文本文件将列出所有的密钥库别名”及其各自的MD5和SHA1哈希的十六进制字符串。
现在,只要找到要签名的APK,SHA1哈希,任何网上六角复制到base64的转换器将其转换为Facebook的需要base64编码格式。您可以通过google搜索“网上十六进制为base64转换器”找到一个在线转换器。我有这个,你可以复制并粘贴字符串右从所提供的框中的文本文件,它只会删除分隔每个字节的十六进制冒号。
最后一个点(。but.)只复制并粘贴十六进制字符串,而不是SHA1:前缀!
希望这可以帮助它工作的肯定
首先,我要感谢Selvin!
这个答案几乎是相同的Selvin的答案,但它仍为3小时,得到它的工作:P所以对于真正的newbs多一点的教程
如何从一个keystore得到hashKey
首先从谷歌代码安装OpenSSL,并把它放到你的C:\\文件夹
发现在Java keytool程序的位置(默认
找到密钥存储位置(有调试默认值)
位置的keytool C:\\程序文件(x86)\\的Java \\ jdk1.xxx)\\ BIN \\密钥工具
openssl的位置C:\\ OpenSSL的Win32的\\ BIN \\ OpenSSL的
位置(调试)密钥库C:
打开cmd在窗口(开始-&运行-& CMD),并导航到位置的keytool
或复制粘贴下面的字符串,请注意,您可以“Ctrl +V,但正确
cd c:\program files (x86)\java\jdk1.7.0_01\bin
当在正确的目录复制粘贴此字符串中的CMD线:
keytool.exe -exportcert -alias androiddebugkey -keystore c:\users\charx\.android\debug.keystore | C:\OpenSSL-Win32\bin\openssl sha1 -binary | C:\OpenSSL-Win32\bin\openssl base64
的yourto确保你改变了你的电脑,你可以在我的情况下,它charx见。另外的目录的Java JDK XXXX取决于你的版本。
CMD应该显示hashkey
散列键为我调试文件是
h1GdQbgB8b/liCG+acmZWkgIRHA=
我不可能是这一切我明白了Facebook SDK实际上是通过发送困扰
我出口签名应用程序与临时代码的地方显示的Facebook error.toString()
在授权]这给哈希键的找,然后我把这个在我的Facebook应用程序和宾果!
本文标题 :找到问题的关键哈希签名的应用程序
本文地址 :CodeGo.net/292836/
Copyright (C) 2014 CodeGo.net随笔 - 37&
评论 - 84&
&&&&&&&&&&&
Android反编译(三)
1).APK签名的要点
a.所有的应用程序都必须有数字证书 ,Android系统不会安装一个没有数字证书的应用程序;
b.Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证;
c.数字证书都是存在有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。&
d.Android使用标准的java工具 Keytool 、Jarsigner 来生成数字证书,并给应用程序包签名。
2).APK签名的好处&
a、应用程序升级:如果想升级应用程序,签名证书要相同,包名称要相同!
b、应用程序模块化:Android 系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块。
c、代码或者数据共享:Android 提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。
3).APK重签名原理
a、Android系统签名主要有ROM签名和应用程序APK签名两种形式。ROM签名是针对已经生成的Android系统ROM包进行签名。应用程序APK签名是针对开发者开发的应用程序APK进行签名。
b、APK实际上是一个jar或者说是一个zip压缩文件,META-INF目录下存放的是压缩包中所有文件的签名信息,用来保证apk包的完整性和系统的安全。
c、重签名:实际上就是删除META-INF目录(删除已有签名),使用自已数据证书再次重签名。
注:APK如有签名自校验(代码有校验)需要修改其代码,非今天文章内容。&
2、工具与准备工作
a.数字证书生成:keytool
JAVA自带工具 & 如:JDK1.7
例:路径 &C:\Program Files\Java\jdk1.7.0_55\bin\keytool.exe
b.重新签名:jarsigner
JAVA自带工具 &如:JDK1.7
例: 路径 &C:\Program Files\Java\jdk1.7.0_55\bin\jarsigner.exe
c.优化APK:zipalign
&Android SDK自带工具 &&
例:路径 &C:\Program Files\adt-bundle-windows-x86_64-\sdk\tools\zipalign.exe
2).准备工作
a.安装JDK,配置环境变量
b.安装Android SDK,配置环境变量&
3、操作步骤
keystore数字证书
a、找现成的keystore文件
路径 & C:\Documents and Settings\Findyou\.android\debug.keystore&
debug.keystore
Keystore name: &#8220;debug.keystore&#8221;&
Keystore password: &#8220;android&#8221;
Key alias: &#8220;androiddebugkey&#8221;
Key password: &#8220;android&#8221;
CN: &#8220;CN=Android Debug,O=Android,C=US&#8221; &&
b、keytool生成keystore数字证书:
(1).[CMD中执行下列命令]
keytool&-genkey&-v&-keystore&debug.keystore&-alias&androiddebugkey&-keyalg&RSA&-validity&10000
&/*解释:&
keytool是工具名称,-genkey意味着执行的是生成数字证书操作,-v表示将生成证书的详细信息打印出来,显示在dos窗口中;&
-keystore& debug.keystore 表示生成的数字证书的文件名为&#8220; debug.keystore&#8221;;
-alias& androiddebugkey&&&表示证书的别名为&#8220; androiddebugkey&&&#8221;,可以与Keystore一样;
-keyalg RSA 表示生成密钥文件所采用的算法为RSA;
-validity 10000 表示该数字证书的有效期为10000天,意味着10000天之后该证书将失效
执行结果输入密钥库口令:&android
再次输入新口令:&android
您的名字与姓氏是什么?
& [Unknown]:&Android Debug
您的组织单位名称是什么?
& [Unknown]:&Android
您的组织名称是什么?
& [Unknown]:&Android
您所在的城市或区域名称是什么?
& [Unknown]:&ShenZhen
您所在的省/市/自治区名称是什么?
& [Unknown]:&GuangDong
该单位的双字母国家/地区代码是什么?& [Unknown]:&CN&
CN=Android Debug, OU=Android, O=Android, L=ShenZhen, ST=GuangDong, C=CN是否正确?
正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 10,000 天):
& & & & &CN=Android Debug, OU=Android, O=Android, L=ShenZhen, ST=GuangDong, C=CN
输入 &androiddebugkey& 的密钥口令
& & & & (如果和密钥库口令相同, 按回车):&[回车]
[正在存储debug.keystore]&
(2).&debug.keystore生成在CMD执行命令的目录中&&
&2)、删除原APK签名文件
(1).ThinkDrive.apk重命名为ThinkDrive.zip,解压ThinkDrive.zip文件&
(2).ThinkDrive重名名为ThinkDrive_temp
(3).ThinkDrive_temp文件夹,找到META-INF,删除META-INF
(4).将ThinkDrive_temp整个文件夹用zip工具,重新打包成zip压缩包,然后更改后缀为apk&
a.进入ThinkDrive_sign文件夹内直接打包文件,不是对ThinkDrive_sign整个文件夹打包,否则会产生二级根目录)
b.注意是ZIP压缩,不是RAR
c.可以用jar来解包,压缩包
解包: jar -xvf &ThinkDrive.apk & & & & & & & &--&为apk文件
压缩包 jar -cvf ../ThinkDrive.apk & ./ & & & & --&进入文件夹打包,不会产生二级根目录;apk生成在上一层,防止死循环&
3)、APK重签名
jarsigner -verbose -keystore debug.keystore -storepass android -keypass android -signedjar&Thinkdrive_signed.apk &Thinkdrive_temp.apk androiddebugkey
jarsigner是Java的签名工具
-verbose参数表示:显示出签名详细信息
-keystore表示使用当前目录中的debug.keystore签名证书文件。
-storepass 密钥口令&
-signedjar ThinkDrive_signed.apk表示签名后生成的APK名称,
ThinkDrive_temp.apk 表示未签名的APK,
androiddebugkey表示debug.keystore的别名
4)、优化APK&
zipalign&-v&4&ThinkDrive_signed.apk&Target.apk
zipalign优化的最根本目的是帮助操作系统更高效率的根据请求索引资源,将resource-handling code统一将Data structure alignment(数据结构对齐标准:DSA)限定为4-byte boundaries。&
小结:通过以上四个步骤 ,最终得到的 Target.apk (名称自己可以第四步生成时自修改) 为重签名后的APK。&
4、装X技巧
偶尔手工敲敲代码无所谓,需要签名的APK一多,那你就废了。你会说,网上下载现成的重签名jar啊之类的,多没意思,来自己整一个批处理。
1)、代码: [重签名.bat]
&REM&key的名称
&SET&KEYSTORE_NAME=debug.keystore
&REM&key的别名
&SET&KEYSTORE_ALIAS=androiddebugkey
&REM&key的密码
&SET&KEYSTORE_STOREPASS=android
&SET&KEYSTORE_KEYPASS=android
&REM&临时文件名或临时文件夹名
&SET&TEMP_PREFIX=temp_
&REM&重签名后apk文件名前缀
&SET&RE-SIGNED=Re-signed_
&FOR&%%I&IN&(*.apk)&DO&(
&&ECHO&[重签名&%%I]
&&&&&ECHO&[创建与APK同名的文件夹]
&&&&&REM&创建文件夹,如果已存在则先删除
&&&&&RD&/S&/Q&【%%I】
&&&&&MD&【%%I】\%TEMP_PREFIX%
&&&&&REM&复制需要重新签名的apk文件到临时文件夹中
&&&&&COPY&%%I&【%%I】\%TEMP_PREFIX%
&&&&&REM&复制key到APK同名文件夹中
&&&&&COPY&%KEYSTORE_NAME%&【%%I】
&&&&&REM&进入临时文件夹
&&&&&CD&【%%I】\%TEMP_PREFIX%
&&REM&解压APK文件
&&&&&JAR&-xvf&%%I
&&&&&REM&删除复制到临时文件夹中的APK文件
&&&&&DEL&%%I
&&&&&REM&删除MANIFEST
&&&&&RD&/S&/Q&META-INF
&&REM&重新压缩成apk文件
&&&&&ECHO&[重新打包成APK]
&&&&&JAR&-cvf&../%TEMP_PREFIX%%%I&./
&&&&&CD&..
&&ECHO&[JARSIGNER&%%I]
&&&&&REM&对APK包重新签名,JDK1.7需要增加参数
&&&&&JARSIGNER&-VERBOSE&-KEYSTORE&%KEYSTORE_NAME%&-STOREPASS&%KEYSTORE_STOREPASS%&%TEMP_PREFIX%%%I&%KEYSTORE_ALIAS%&-KEYPASS&%KEYSTORE_KEYPASS%
&&&&&ECHO&[删除JARSIGNER临时文件]
&&&&&RD&/S&/Q&%TEMP_PREFIX%
&&&&&REM&删除同名文件夹中复制的debug.keystore
&&&&&DEL&%KEYSTORE_NAME%
&&ECHO&[ZIPALIGN&%%I]
&&&&&REM&使用android的zipalign工具对apk文件进行优化
&&&&&ZIPALIGN&-v&4&%TEMP_PREFIX%%%I&%RE-SIGNED%%%I
&&&&&REM&检查apk文件是否被优化
&&&&&ZIPALIGN&-c&-v&4&%RE-SIGNED%%%I
&&&&&ECHO&[删除ZIPALIGN临时文件]
&&&&&REM&删除优化前的APK文件,保留优化后的APK
&&&&&DEL&%TEMP_PREFIX%%%I
&&&&&CD&..
&&&&&ECHO&[重签名完成]&&%RE-SIGNED%%%I
&&&&&ECHO.
2)、使用方法
(1).拷贝 xxxx.keystore&签名文件至&"重签名.bat"所在目录中
(2).拷贝需要重签名的APK文件至&"&重签名.bat"所在目录中
(3).双击运行"重签名.bat" 脚本
注:如需重签名多个APK,可全部拷贝至&"&重签名.bat"所在目录中,BAT会查找到当前目录下所有APK,全部重签名。
执行结果图:
1)、重签名安装失败(证书问题)&
检查:是否JDK1.7,如果JDK1.7签名问题,JARSIGNER需要增加两个参数。
-digestalg&SHA1&-sigalg&MD5withRSA
2)、安装成功,运行失败
检查:a.首先需要排除重签名问题(再重签一遍安装)
b.重签再装仍有问题,检查是否程序有自签名检查,如有签名检查较为复杂。大体讲解一下思路,反编译代码为JAVA找到签名检查代码,分析逻辑,用apktool反编译,修改对应smail代码,再重新打包,签名。
阅读(...) 评论()}

我要回帖

更多关于 keytool 密钥库口令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信