文档章节

android签名机制(1)——了解签名

blackylin
 blackylin
发布于 2013/11/16 17:44
字数 997
阅读 2204
收藏 4

android中所有运行在设备上的应用都必须要签名,这是系统提供的一种安全认证机制。
下面以问答形式来自我认识下,后面在根据部分内容来进一步研究:

1.为什么用签名机制?如果不签名呢?

为了防止app被反编译替换原有的程序,如果有相同包名的应用存在,新的apk则不能安装在设备上。 就算被反编译,在没有原有私钥的情况,重新签名生成的apk和原来的apk的标志是不同的。如此,被修改的apk如果安装在原来的设备上,则会提示:
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

如果不签名呢?
直接安装到设备上,则也提示:

从上面可以有个很简易的认知,如果不签名或者签名不对,则不能安装在设备上。

如果应用androidmenifast.xml中加了android:sharedUserId="android.uid.system"时,要用平台签名,否则提示
  
更多安装异常可以查找相关信息。

2.平台签名?签名有很多种么?

有很多种。在android源码目录build\target\product\security,有如下几种签名密钥。

*.pk8表示的是private key---私钥
*.x509.pem理解为公钥

这里的platform.*即为平台签名的私钥和公钥,加密方式是非对称加密。
从上图可以看出有好几种的签名,4种具体表示可参考当前目录下的README.

The following commands were used to generate the test key pairs:
//制作key的脚本和相关信息
  development/tools/make_key testkey  '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
  development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
  development/tools/make_key shared   '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
  development/tools/make_key media    '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

The following standard test keys are currently included:

//testkey--当应用没有指定其他key时,源码默认以此key签名
testkey -- a generic key for packages that do not otherwise specify a key.
//平台签名,系统级应用用此签名
platform -- a test key for packages that are part of the core platform.
//当需要用到联系人的共享数据时,需要此签名
shared -- a test key for things that are shared in the home/contacts process.
//对系统的media/download相关的应用,用此签名
media -- a test key for packages that are part of the media/download system.

These test keys are used strictly in development, and should never be assumed
to convey any sort of validity.  When $BUILD_SECURE=true, the code should not
honor these keys in any context.


signing using the openssl commandline (for boot/system images)
--------------------------------------------------------------

1. convert pk8 format key to pem format
   % openssl pkcs8 -inform DER -nocrypt -in testkey.pk8 -out testkey.pem

2. create a signature using the pem format key
   % openssl dgst -binary -sha1 -sign testkey.pem FILE > FILE.sig

extracting public keys for embedding
------------------------------------
it's a Java tool
but it generates C code
take a look at commands/recovery/Android.mk
you'll see it running $(HOST_OUT_JAVA_LIBRARIES)/dumpkey.jar

从shareed签名,可以联想到:
当A应用需要用到B应用的共享数据时,他们的
android:sharedUserId="xxx"需要一致,签名也需要一致

注:当应用工程的Android.mk中未指定LOCAL_CERTIFICATE时,源码编译则使用默认testkey


3.如何区别签名过和没签名的apk?

注:apk支持多次签名,以最后一次为准
apk是个zip包格式,这里就有个很简单直观的方式---用压缩程序方式打开apk,看下图:

签名过的apk包里有个META-INF文件夹,里面就是对各个资源文件用SHA1加密后的值。

4.如何签名?

loop   android签名机制(2)——如何签名

5.了解加密、数字摘要、数字签名和数字证书

参考:http://www.cnblogs.com/heart-runner/archive/2012/01/30/2332020.html


问题待补充...
 参考:  http://developer.android.com/tools/publishing/app-signing.html  

© 著作权归作者所有

blackylin
粉丝 48
博文 47
码字总数 27860
作品 0
深圳
Android工程师
私信 提问
[RK3399][Android7.1] 调试笔记 --- app安装失败提示证书有问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kris_fei/article/details/84766460 Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 现象: 在rk3288上预...

KrisFei
2018/12/03
0
0
android应用实现重启系统+签名

1.在AndroidManifest.xml文件的manifest标签中加入一条android:sharedUserId="android.uid.system" <manifest xmlns:android="http://schemas.android.com/apk/res/android" <uses-permissi......

blackylin
2012/08/09
0
18
android签名机制(3)——如何制作签名

一、制作android签名公钥/密钥 1.生成长度为2048位的RSA私钥 openssl genrsa -3 -out test.pem 2048 2.生成x509格式的公钥证书 openssl req -new -x509 -key test.pem -out test.x509.pem -d......

blackylin
2014/01/21
0
1
Android 应用程序签名

Android应用程序签名相关的理论知识包括:什么是签名、为什么要给应用程序签名、如何给应用程序签名等。 1、什么是签名? 如果这个问题不是放在Android开发中来问,如果是放在一个普通的版块...

长平狐
2013/01/06
110
0
C#-Xamarin的Android项目开发(三)——发布、部署、打包

前言 部署,通常的情况下,它其实也是项目开发的一个难点。 为什么这么说呢?因为,它不是代码开发,所以很多开发者本能的拒绝学习它。 并且一个项目配置好一次以后,部署的步骤和部署的人通...

kiba518
03/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

研究下这代码,用到了guava和线程池

import com.google.common.util.concurrent.FutureCallback;import com.google.common.util.concurrent.Futures;import com.google.common.util.concurrent.ListenableFuture;import c......

暗中观察
24分钟前
3
0
《css 揭秘》 之垂直居中的实现

最近看了 Lea Verou 的 《css揭秘》一书,让我对自己的 css学习产生了深深的怀疑。这本书真是太棒了,里面涉及到很多优雅又有趣的效果实现,真的是非常棒。如果你有时间,十分建议你去看看。...

IrisHuang
29分钟前
3
0
java 抽象类(2)

/*需求: 描述一个图形、圆形、 矩形三个类。不管哪种图形都会具备计算面积与周长的行为,但是每种图形计算的方式不一致而已。常量的命名规范:全部字母大写,单词与单词 之间 使用下...

hellation_
32分钟前
2
0
总结:堆和栈

堆 堆比较好理解,即存放对象的地方。这里的对象由GC管理 1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命...

浮躁的码农
38分钟前
1
0
JavaScript 新语法详解:Class 的私有属性与私有方法

译者按: 为什么偏要用**#**符号? 原文:JavaScript's new #private class fields 译者:Fundebug 本文采用意译,版权归原作者所有 proposal-class-fields与proposal-private-methods定义了 ...

Fundebug
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部