android的签名机制

Android签名机制对于应用发布至关重要,确保软件安全和权限控制。签名包括APK签名和img文件签名。APK签名用于标识发行机构,防止软件篡改。img文件签名保证文件完整性和升级安全。签名过程涉及多种key,如platform、shared和media等,用于不同权限需求。签名工具有signapk.jar和sign_target_files_apks,用于对APK和系统文件进行签名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    android签名机制

    发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的。签名机制在Android应用和框架中有着十分重要的作用。例如,Android系统禁止更新安装签名不一致的APK;如果应用需要使用system权限,必须保证APK签名与Framework签名一致,等等。在《APK Crack》一文中,我们了解到,要破解一个APK,必然需要重新对APK进行签名。而这个签名,一般情况无法再与APK原先的签名保持一致。(除非APK原作者的私钥泄漏,那已经是另一个层次的软件安全问题了。简单地说,签名机制标明了APK的发行机构。因此,站在软件安全的角度,我们就可以通过比对APK的签名情况,判断此APK是否由“官方”发行,而不是被破解篡改过重新签名打包的“盗版软件”。

    目前主要的签名有两种方式,签名包括2 种,第一种是对APK 签名,即开发者开发的应用;第二种是对Android img 签名,保证img文件的完整性和后续升级,如果img文件被破解的话,则不能升级到最新的版本,应用apk也是同样的原理,这也是apk被破解不能升级的原因。

    在linux系统下编译的时候,将会使用google原生的key的apk和应用进行签名,签名的脚步和key分别保存在如下的路径,有兴趣的话,可以研究一下:

   android\build\tools\releasetools     build\target\product\security

   android默认的key主要有以下几种类型,每种key对应的权限不同:
   testkey(releasekey) -- a generic key for packages that do not otherwise specify a key.  开发过程中的key
   platform -- a test key for packages that are part of the core platform.   当APK 完成一些系统的核心功能时使用,这种方式编译出来的APK所在进程的UID 为system。
    shared -- a test key for things that are shared in the home/contacts process. 当APK 需要和home/contacts 进程共享数据时使用
    media -- a test key for packages that are part of the media/download system. 当APK 是media/download 系统中的一环时使用
    如何生成自己的key,主要有两种方法,一种是使用keytool工具,比较简单,在调试应用程序时,Android SDK工具会自动对应用程序进行了签名。Eclipse的ADT插件和Ant编译工具都提供了两种签名模式——Debug模式和Release模式。 在开发和测试时,可以使用Debug模式。Debug模式下,编译工具使用内嵌在JDK中的Keytool工具来创建一个keystore和一个 key(包含公认的名字和密码)。在每次编译的时候,会使用这个Debug Key来为apk文件签名。由于密码是公认的所以每次编译的时候,并不需要提示你输入keystore和key密码。另外一种是使用make_key工具生成签名文件
development/tools$ sh make_key releasekey '/C=CN/ST=JiangSu/L=NanJing/O=Company/OU=Department/CN=YourName/emailAddress=YourE-mailAddress'

Enter password for 'releasekey' (blank for none; password will be visible): mypassword     <------- 设置你的密码 
creating platform.pk8 with password [mypassword]
Generating RSA private key, 2048 bit long modulus e is 3 (0x3)
这里要顺便介绍下make_key的参数。第一个参数是要生成key的名字,第二个参数是关于你公司的邮箱,具体的参数可以看说明。

     下来,我们分别看一下对apk和img签名的方法。

     1 APK签名

      查看apk签名的方法如下:jarsinger -verify -verbose -certs apk(apk名称)  可以查看签名的信息。
      查询结果:没有清单。 表示jar未签名。如果是用Eclipse+SDK开发,则会有一个默认的签名,查看如下:
      sm      1752 Fri Dec 05 10:45:42 CST 2014 AndroidManifest.xml
      X.509, CN=Android Debug, O=Android, C=US      [证书的有效期为 14-1-28 下午5:38 至 44-1-21 下午5:38]
    

     可以使用signapk.jar对apk进行签名,在源码中的位置如下:

     可以在platform/build/target/product/security/中找到platform.pk8 platform.x509.pem等签名文件,对应不同的权限。
signapk.jar:由/platform/build/tools/signapk/编译产出,可以在/out/host/linux-x86/framework/中找到。
签名:java -jar signapk.jar platform.x509.pem platform.pk8 MyDemo.apk MyDemo_signed.apk 得到具有对应权限的APK
优化APK:zipalign -v 4 MyDemo_signed.apk MyDemo_new.apk

    2 img文件签名

      这种比较简单,一是在系统编译前,直接使用用自己的key替换掉android原生的key,编译完,系统就是用新的key签过名了;二是在编译完,分别对apk和img文件签名,主要有以下两个步骤,直接从别的博客copy过来。

   1对apk进行签名

   android_src$ ./build/tools/releasetools/sign_target_files_apks -d vendor/Modul/security/product_modul/ out/dist/product_modul-target_files.zip  out/dist/signed_target_files.zip

ERROR: no key specified for:
  CalendarWidget.apk
  Contacts_yellowpage.apk
  SnsAppMain.apk
  fbandroid-1.5.0.apk
  AnalogClockWidget.apk
  MessageWidget.apk
  NewsWidget.apk

上面的意思是使用sign_target_files_apks工具采用vendor/Modul/security/product_modul /下的key对product_modul-target_files.zip文件进行签名,并把签名结果放在out/dist /signed_target_files.zip里.

从上面的签名结果看,签名并没有成功,原因是由于有些apk程序已经签过名了或者找不到对应的key. 这也难不倒我们,我们可以通过设置过滤,不对上面的程序进行签名.方法如下:

通过参数"-e <apkname>=" 来过滤这些程序.

android_src$ ./build/tools/releasetools/sign_target_files_apks -d vendor/Modul/security/product_modul/  -e  CalendarWidget.apk=  -e   Contacts_yellowpage.apk=   -e  SnsAppMain.apk=  -e fbandroid-1.5.0.apk=  -e AnalogClockWidget.apk=  -e MessageWidget.apk=  -e  NewsWidget.apk=    out/dist/product_modul-target_files.zip  out/dist/signed_target_files.zip

Enter password for vendor/Modul/security/product_modul//media key>         <----- imput the password 
Enter password for vendor/Modul/security/product_modul//platform key>      <----- imput the password 
Enter password for vendor/Modul/security/product_modul//releasekey key>  <----- imput the password 
Enter password for vendor/Modul/security/product_modul//shared key>        <----- imput the password 
rewriting RECOVERY/RAMDISK/default.prop:
  replace:  ro.build.tags=test-keys
     with:  ro.build.tags=release-keys

NOT signing: CalendarWidget.apk
NOT signing: Contacts_yellowpage.apk
    signing: Mms.apk                             
    signing: SoundRecorder.apk               
    signing: AccountAndSyncSettings.apk          
    signing: Camera.apk                           
.......................................................................
rewriting SYSTEM/build.prop:
  replace:  ro.build.tags=test-keys
     with:  ro.build.tags=release-keys
  replace:  ro.build.description= test-keys
     with:  ro.build.description= release-keys
  replace:  ro.build.fingerprint=...........................
     with:  ro.build.fingerprint=.............................
    signing: framework-res.apk                     
done.

这样就完成了android系统的签名工作.

   2 对img进行签名

android_src$ ./build/tools/releasetools/img_from_target_files  out/dist/signed-target-files.zip  out/dist/signed-img.zip
creating boot.img...
creating recovery.img...
creating system.img...
creating userdata.img...
cleaning up...
done.

使用img_from_target_files工具生成signed-img.zip文件.signed-img.zip文件包含了boot.img,userdate.img,system.img文件等.

    



<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、付费专栏及课程。

余额充值