昨天看了一下Android中的签名机制,这里介绍一下Android中签名用的Key的产生方法和签名的原理。
产生Key
o 产生RSA私钥(private key)
openssl genrsa -3 -out testkey.pem 2048
-3 是算法的参数(public exponent)。
2048 是私钥长度。
testkey.pem 是输出的文件。
o 产生PKCS#10格式的认证请求。所谓认证请求就是发给认证机构认证的一个请求,它主要包括一个公钥和一些相关信息(如组织名称和联系人邮件地址)。
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 /
-subj ‘/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com’
如果不提供最后两个参数,openssl会提示你输入相关信息,这里的信息可以根据你自己的实际情况填写。如:
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000
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]:Topwise
Organizational Unit Name (eg, section) []:Broncho
Common Name (eg, your name or your server’s hostname) []:broncho.cn
Email Address []:bronchosales@gmail.com
o 把私钥的格式转换成PKCS #8(Private-Key Information Syntax Standard.)
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
私钥是不能让别人知道的,否则就起不到保密的作用了。私钥通常是要加密保存的,但这里指定了-nocryp,表示不加密。
Android提供了一个脚本mkkey.sh用来简化上面的步骤:
if ["$1" == ""]; then
echo "Create a test certificate key."
echo "Usage: $0 NAME"
echo "Will generate NAME.pk8 and NAME.x509.pem"
echo " /C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com"
return
fi
openssl genrsa -3 -out $1.pem 2048
openssl req -new -x509 -key $1.pem -out $1.x509.pem -days 10000 /
-subj '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
openssl pkcs8 -in $1.pem -topk8 -outform DER -out $1.pk8 -nocrypt
签名
Android提供了为jar/zip文件签名的程序signapk.jar 。
它的用法如下:
Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar
第一个参数是公钥,即前面第二步产生的testkey.x509.pem。
第二个参数是私钥,即前面第三步产生的testkey.pk8。
第三个参数是要签名的文件。
第四个参数是输出的文件(即签名后的文件)。
如:java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update-signed.zip
现在我们来看看签名到底做了些什么:
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);
o 对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));
o 把对输出文件的签名和公钥写入CERT.RSA。
// CERT.RSA
je = new JarEntry(CERT_RSA_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
writeSignatureBlock(signature, publicKey, outputJar);
签名的作用
签名的主要目的为了检测文件是否被别人修改了。但它并不能禁止别人修改,因为你完全重新生成签名,但是你生成的签名和原来是不一样的。
- 浏览: 2290418 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
wahahachuang5:
web实时推送技术使用越来越广泛,但是自己开发又太麻烦了,我觉 ...
细说websocket - php篇 -
wahahachuang8:
挺好的,学习了
细说websocket - php篇 -
jacking124:
学习了!支持你,继续
初窥Linux 之 我最常用的20条命令 -
aliahhqcheng:
应该是可以实现的,没有看过源码。你可以参考下:http://w ...
Jackson 框架,轻易转换JSON
发表评论
-
andorid RecyclerView下拉刷新,上拉加载更多
2016-09-12 10:03 510描述: andorid RecyclerView下拉刷新, ... -
安卓手机赚钱APP—学生赚完美版,一天至少50块 有图有真相
2015-10-10 10:16 9有钱赚,一款能赚钱的APP,一款让你越来越有钱的 ... -
andorid脑筋急转弯(完整数据版)源码
2014-09-25 13:58 942脑筋急转弯(完整数据版),集成海量题目,内容丰富、形式 ... -
android 开发怎么赚钱
2014-04-03 17:26 0大家肯定会问,从事安卓开发,有前途吗? ... -
从初学android到选择每天收入50块,收入还在慢慢增加
2014-04-03 13:44 1510从自学安卓一年到到现在每天有一点的收入还是蛮有成就感的 。本人 ... -
android获取手机中的短信和,android获取手机通讯录联系人和号码
2013-10-24 22:49 2844// 获得所有的联系人 Cursor cur = g ... -
QQ和新浪帐号授权登录
2013-10-24 22:39 1585package p.wy.hc.activity; ... -
Android 全退出
2013-10-21 13:18 1067/**监听对话框里面的button点击事件*/ ... -
Android开发精典案例60个 超全
2013-10-20 14:48 1564android超全例子,附带源码 。 源码下载地址 ... -
Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
2013-10-20 14:40 2232前段时间因为换工作的缘故又恰巧碰到国庆节,所以有段时间自己 ... -
【开源项目】Android 手写记事 App(半成品)
2013-10-07 22:08 1134该项目已上传到 CSDN 的 Git 平台中 项目地址:h ... -
安卓折线图插件和自带截图分享的实现
2013-10-08 09:49 1224package com.example.te ... -
ListView的Item中含有EditText,获取EditText里面的值并且刷新ListView值不改变
2013-01-24 00:40 1676最近项目中用ListView ,ListView的item是 ... -
Android 源码的编译
2013-02-21 00:07 649/** 版本:1.0 日期:2009-03-18 作者:HKj ... -
android 导入第三方库出现java.lang.NoClassDefFoundError
2013-03-07 15:26 984导入第3方jar包问题,明明导入了jar但还是报java.la ... -
Android获取SDcard所有的MP3文件的方法
2013-03-17 23:44 1260我们做音乐播放器的时候需要从sdcard里面获取MP3文件和 ... -
解决popupWindow 的android.view.WindowManager$BadTokenException问题
2013-04-17 19:03 1755PopupWindow 写在事件监听里面是不会出现这个异常的 ... -
android对图片的缩放,拖地,跟系统图库的效果一样
2013-04-20 10:36 833之前做项目要对图片的查看,然后就自己写了一个,适合对图片的浏 ... -
自定义ImageView支持缩放,拖拽,方便复用
2013-04-20 17:35 922今天刚发了一篇关于ImageView的缩放和拖拽的博客,然后 ... -
Android在非UI线程中显示Toast
2013-05-09 11:38 1033public void showToast(String m ...
相关推荐
一、Android签名机制--基础概念 1. 消息摘要算法 2. 非对称加密算法(RSA算法) 3. 数字签名 二、Android签名机制--APK签名过程 1. APK签名概述 2. APK签名相关的文件 3. 签名的过程(MANIFEST.MF) 4. 签名的过程...
本文深入探讨了Android系统数字签名验证机制中存在的一类漏洞,以及其成因和可能的解决方案。首先,文章介绍了数字签名和验证过程的基本原理,随后详细分析了Android系统数字签名机制的具体作用及其潜在的漏洞。 在...
Android V2签名机制是Android应用开发中的一个重要环节,特别是在Android 7.0及更高版本中。数字签名在保障应用安全方面起着至关重要的作用,确保应用的来源可信,并且在更新时保持一致性。未签名的应用无法在...
Delphi XE5 中的签名机制是应用程序在 Android 平台上发布时必不可少的步骤。通过生成新的签名文件或选择已经存在的签名文件,开发者可以确保应用程序的安全和可靠性,从而提高应用程序的质量和可靠性。 Delphi XE...
在Android应用开发中,签名是必不可少的一环,它关乎到应用的安全性和可分发性。在Mac环境下,针对Android APK的签名工具有多种选择,...在进行Android开发时,了解和掌握签名机制以及如何使用这样的工具是至关重要的。
以下是关于Android签名机制的详细解释: 1. **生成Key** - 私钥(private key)的生成:使用`openssl`工具,通过`openssl genrsa`命令创建RSA私钥,例如`openssl genrsa -3 -out testkey.pem 2048`,这里的参数`-3`...
一、Android签名机制 Android系统的签名机制是为了保证应用的完整性和防止篡改。每个APK文件在打包后都会包含一个数字签名,这个签名验证了应用的代码和资源没有被修改过。当用户尝试安装应用时,Android系统会检查...
以下将详细介绍Android签名机制以及如何使用这样的工具。 一、Android签名机制 Android应用在发布前必须经过数字签名,以验证应用的来源并确保其在安装和运行时未被篡改。签名过程涉及到以下几个关键概念: 1. **...
在Android系统中,APK签名是一个至关重要的过程,它确保了应用的完整性和开发者身份的验证。在Android 10中,这个过程没有本质的...开发者需熟知签名机制,合理运用签名工具,遵循最佳实践,以确保应用的质量和安全性。
总的来说,Android签名是保障应用安全的重要手段,理解并熟练掌握签名机制和相关工具的使用对于Android开发者至关重要。无论是手动操作还是借助工具,都需要确保签名过程的正确执行,以确保应用能够顺利发布并提供...
总结来说,Android的“沙箱”机制、`sharedUserId`和签名机制共同构成了一个相对安全的应用环境。理解并正确运用这些机制,有助于开发者构建更安全、更可控的Android应用,同时也为用户提供更好的隐私保护。
在Android操作系统中,系统签名文件扮演着至关重要的角色,它确保了应用和系统的安全性和完整性。Android系统签名是为了验证应用程序或系统更新是否来源于可信的源,并且未经篡改。这个过程涉及到一系列的安全机制,...
本文将详细阐述Android系统的签名机制,包括其重要性、工作原理以及如何使用签名工具。 一、Android系统签名的重要性 1. **验证应用来源**:签名能证明应用的开发者身份,使用户了解应用的来源,增加用户的信任度...
在Android操作系统中,系统签名是一项至关重要的安全机制,它确保了系统的完整性以及应用程序的权限管理。这个名为"Android 系统签名.zip"的压缩包包含了用于Android系统签名的关键文件,让我们逐一了解它们的作用。...
首先,让我们理解Android系统的签名机制。Android使用数字签名来验证应用程序的身份和完整性,防止恶意代码篡改。系统签名层是用于签名系统应用程序和APKs,确保它们具有足够的权限来访问受保护的系统资源。在...
### Android签名和权限详解 #### 一、移动平台中的主流签名作用:自签名的完整性鉴别 在移动平台中,特别是Android系统中,签名扮演着至关重要的角色。它不仅仅是确保应用程序来源的真实性,还涉及到应用程序的...
首先,了解Android应用的签名机制至关重要。在Android上,每个应用程序在发布之前都需要经过签名。签名的主要目的是验证应用的开发者身份,确保应用在安装和运行时未被篡改,同时允许应用获取特定的权限。Android...
Android数字签名是Android系统安全机制的关键组成部分,确保了应用程序的来源可识别且代码未被篡改。每一个在Android系统上安装的应用程序都需要通过数字证书进行签名,这与Java平台的安全模型相似。数字证书包含了...
在Android系统中,签名机制是保障应用程序安全性和完整性的关键环节。它涉及到多个方面的知识,包括数字签名、证书、密钥对以及应用的发布流程。本文将深入解析Android的签名原理,帮助你全面理解这一重要概念。 ...