android签名机制1

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理解为公钥
*.pk8表示的是private key---私钥
*.x509.pem理解为公钥

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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  

原作者:http://my.oschina.net/blackylin/blog/176851

<think>我们正在讨论Android应用签名机制。根据用户的问题,我们需要详细解释Android应用签名机制的原理,特别是V1(JAR签名)和V2(全文件签名)机制。参考引用内容: [^1]介绍了V2签名机制,它是在Android7.0引入的,目的是加快验证速度并加强完整性保证。V2签名是对整个APK文件进行签名和验证,而不是像V1那样对每个文件进行验证。[^2]提到了签名校验的机制,以及申请第三方SDK时需要填入的SAH1值(实际上是证书的SHA1指纹)和快速批量打包如何绕过签名校验。[^3]解释了数字签名的基本概念:计算数据的消息摘要,然后用私钥对消息摘要进行加密得到签名。因此,我们的回答应该包括:1.签名的基本目的:确保应用来源的真实性和完整性。2.V1签名(JAR签名)的详细过程及其缺点。3. V2签名的引入和原理,以及它与V1签名的区别。4.可能还会提到V3签名(如果引用中没有,但根据知识,可以简要提及,但用户问题中未要求,引用中也没有,所以可以省略或简单带过)。5.签名在安装过程中的验证。注意:用户要求使用中文回答,并且按照系统级指令处理数学公式(但本问题可能不涉及数学公式,所以可以忽略数学格式要求,但如果有公式,比如哈希函数,则用$...$)。另外,根据指令,我们需要在回答末尾生成相关问题。结构:1.首先介绍签名的目的。2.然后介绍V1签名(JAR签名)的原理和步骤,以及其缺点。3.接着介绍V2签名的原理和步骤,以及如何解决V1的问题。4.最后简要说明安装时的验证过程。注意:引用内容中提到了V2签名机制,我们可以引用[^1]和[^3]来解释数字签名的基本原理和V2的设计。由于用户要求引用标识,我们在引用内容的末尾添加引用标识。我们开始组织回答。</think>### Android应用签名机制原理详解 Android应用签名机制的核心是**验证应用来源的真实性和完整性**,防止恶意篡改。签名过程基于非对称加密技术,主要包含V1(JAR签名)和V2(全文件签名)两种机制: #### 1. **数字签名基础原理** - **签名生成**: 1. 开发者使用`keytool`生成密钥对(私钥+公钥证书)。 2. 计算APK文件的**消息摘要**(如SHA-256哈希值)$H = \text{Hash}(APK)$。 3. 用**私钥加密摘要**生成签名:$S = \text{Encrypt}_{\text{private}}(H)$。 - **签名验证**: 1. 系统提取APK中的签名$S$和公钥证书。 2. 用公钥解密$S$得到$H'$:$H' = \text{Decrypt}_{\text{public}}(S)$。 3. 重新计算APK的哈希值$H$,若$H = H'$则验证通过[^3]。 > **为什么不直接加密整个APK?** > 加密摘要而非完整数据,可大幅提升效率并保持同等安全性[^3]。 #### 2. **V1签名(JAR签名)** - **原理**: - 解压APK,对每个文件单独计算哈希值,写入`MANIFEST.MF`。 - 用私钥加密`MANIFEST.MF`的哈希值,生成签名文件`CERT.SF`和`CERT.RSA`。 - **缺点**: - **校验慢**:需解压并逐个验证文件,资源多时效率低。 - **篡改风险**:攻击者可修改压缩包内容后重新签名[^1]。 #### 3. **V2签名(全文件签名)** - **Android 7.0引入**: - 直接对整个APK文件(包括ZIP结构)计算哈希树(Merkle Tree)。 - 将签名块(含加密摘要)插入APK的**ZIP中央目录之前**(如图): ``` [文件数据] → [V2签名块] → [ZIP中央目录] → [文件尾] ``` - **优势**: - **完整性更强**:任何修改(包括ZIP结构)都会破坏哈希树。 - **验证更快**:只需校验单个签名块和整体哈希树[^1]。 - **兼容性**:Android 7.0+优先使用V2,低版本自动降级V1。 #### 4. **签名验证流程** 安装APK时: 1. 系统检查签名证书是否可信(如系统证书或用户信任证书)。 2. 根据APK版本选择V1/V2验证机制。 3. 校验摘要一致性,失败则拒绝安装[^2]。 > **第三方SDK的SHA1值是什么?** > 即开发者证书的SHA1指纹,用于第三方平台(如微信支付)验证应用身份[^2]。 #### 5. **绕过签名校验的风险** 批量打包工具常篡改`AndroidManifest.xml`或资源文件后重签名,但V2签名能有效防御此类攻击[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值