介绍一下Android中签名用的Key的产生方法。

产生Key
工具: openssl


1产生RSA私钥(private key)
openssl genrsa -3 -out testkey.pem 2048
解释:
-3 是算法的参数 2048 是私钥长度,testkey.pem 是输出的文件。

2产生PKCS#10格式的认证请求。
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 -config c:\openssl\bin\openssl.cnf
后面的配置文件位置请根据自己的安装openssl目录确定,如果执行文件openssl目录下可以不用写路径

openssl会提示你输入相关信息,这里的信息可以根据你自己的实际情况填写。如:

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:GuangDong
Locality Name (eg, city) [Newbury]:ShenZhen
Organization Name (eg, company) [My Company Ltd]:XXXX
Organizational Unit Name (eg, section) []:XXX

Common Name (eg, your name or your server’s hostname) []:XXX.com
Email Address []:XXX@gmail.com

3把私钥的格式转换成PKCS #8(Private-Key Information Syntax Standard.)

openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt

这里指定了-nocryp,表示不加密。


签名

Android提供了为jar/zip文件签名的程序signapk.jar 。

它的用法如下:
Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar

EX: java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update-signed.zip

用解压缩工具打开Update-signed.zip 在目录META-INF可以看到

现在我们来看看签名到底做了些什么:

o 先为输入的jar/zip文件中的所有文件生成SHA1数字签名(除了CERT.RSA,CERT.SF和MANIFEST.MF)

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 = null;
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);
}
}
并把数字签名信息写入MANIFEST.MF

je = new JarEntry(JarFile.MANIFEST_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
manifest.write(outputJar);

对manifest签名并写入CERT.SF

// 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));

把对输出文件的签名和公钥写入CERT.RSA。

// CERT.RSA
je = new JarEntry(CERT_RSA_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
writeSignatureBlock(signature, publicKey, outputJar);

更多相关文章

  1. android image 压缩和解压 unyaffs与mkyaffs2image
  2. Android(安卓)工程中各种文件的介绍
  3. 使用命令行签名Android应用程序
  4. Android资源文件xml的编写
  5. 读取android手机流量信息
  6. android背景选择器selector用法汇总
  7. 【android】Android(安卓)Studio2.3打包提示Please select at le
  8. Android(安卓)service 实现过程
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android(安卓)ScrollView嵌套WebView出现
  2. Android教父高焕堂谈Android“开源”与“
  3. [置顶] Android 内存泄露的几种情形
  4. Android 什么是 Material Design
  5. 漫谈Android与Chrome OS
  6. Android学习之如何配置使用Android studi
  7. .net程序员业余Android开发赚点外快(介绍
  8. Android优势和劣势分析(面试华为的人有被
  9. Android动画效果 translate、scale、alph
  10. 安卓一些错误的总结