`
MyEyeOfJava
  • 浏览: 1156652 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7af2d6ca-4fe1-3e9a-be85-3f65f7120bd0
测试开发
浏览量:71341
533896eb-dd7b-3cde-b4d3-cc1ce02c1c14
晨记
浏览量:0
社区版块
存档分类
最新评论

Android签名与认证详细分析之一(CERT.RSA剖析)

阅读更多

一、Android签名概述

我们已经知道的是:Android对每一个Apk文件都会进行签名,在Apk文件安装时,系统会对其签名信息进行比对,判断程序的完整性,从而决定该Apk文件是否可以安装,在一定程度上达到安全的目的。

给定一个Apk文件,解压,可以看到一个META-INFO文件夹,在该文件夹下有三个文件:分别为MANIFEST.MFCERT.SFCERT.RSA。这三个文件分别表征以下含义:

(1)MANIFEST.MF:这是摘要文件。程序遍历Apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。如果你改变了apk包中的文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFEST.MF的检验信息不同,于是程序就不能成功安装。

说明:如果攻击者修改了程序的内容,有重新生成了新的摘要,那么就可以通过验证,所以这是一个非常简单的验证。

(2)CERT.SF:这是对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。

说明:在这一步,即使开发者修改了程序内容,并生成了新的摘要文件,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件(CERT.SF)。系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件(MANIFEST.MF)对应不起来,所以不能通过检验,不能成功安装文件。

(3)CERT.RSA文件中保存了公钥、所采用的加密算法等信息。

说明:系统对签名文件进行解密,所需要的公钥就是从这个文件里取出来的。

结论:从上面的总结可以看出,META-INFO里面的说那个文件环环相扣,从而保证Android程序的安全性。(只是防止开发者的程序不被攻击者修改,如果开发者的公私钥对对攻击者得到或者开发者开发出攻击程序,Android系统都无法检测出来。)

参考文章:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html

二、在Eclipse下配置App的签名信息

对App进行签名的方式一般有以下几种:通过Google提供的签名工具,通过某些开发者开发的签名工具或者通过Eclipse提供的签名方法,但一般而言,他们都是在下层调用Google提供的签名工具,所以签名的方法都相同。

例如,在Eclipse下面配置签名信息时,可以设置开发者信息:

具体参考文章:http://blog.csdn.net/zuolongsnail/article/details/6444197(上图来源于该文章)

说明:从上图可以看出,在Eclipse中,可以设置开发者的详细信息。在其他的签名工具中,可能会直接调用其他签名信息。

值得注意的是,在设置签名信息的时候,会有如下图所示的步骤:

请暂且记住这里有认证指纹信息:MD5和SHA1。由于这一步骤是在编译生成Apk文件之前进行的,所以,说明这里的MD5和SHA1与程序的内容毫无关系,只与开发者的公私钥对等开发信息有关。

我们自己设置签名信息之后开发程序并签名,得到的签名信息经过keytool.exe解析结果如下:

说明:由上图可以发现,解析结果中的MD5和SHA1与上面得到的MD5,SHA1是相同的。

三、同一个公司的不同App的签名有关系吗?

我们有一个疑问,许多互联网大公司会开发许多官方的移动应用,那么这些应用的签名信息是否相同呢,他们所用的公私钥对是否都是一样的?我们对Tencent公司的QQ,QQ空间,微信三款产品进行解析,得到下面的结果和结论。

1、使用keytool.exe

使用Java提供的keytool.exe工具对三款产品的签名情况(CERT.RSA文件)进行解析,情况如下所示。

微信:

QQ:

QQ空间:

说明:从上面的三幅图可以看出,虽然同为Tencent的三款产品,但是他们的所有者信息、签发人信息等都不尽相同,尽管他们都表示了腾讯公司或者Tencent等信息。因为这是开发者自己设置的,而且微信和QQ属于不同的事业部,办公地点不同,所以他们的签名信息不同也就不足为奇了。

2、自己写应用提取

自己写程序从CERT.RSA提取出公钥信息和证书中的签名信息(对开发者信息的签名,例如姓名,公司,国家等。。。),情况如下:

由于都是一些字符,且很多,所以只取开始和结束的几位比特做一说明:

微信:

公钥:c05f........5e9f

签名:3082....1949

QQ:

公钥:a15e........3695

签名:3082........2049

QQ空间:

公钥:82d...........445

签名:3082........1677

说明:由于三款App的开发者设置的签名信息几乎不同,使用的公私钥对都不同,所以这里取出来的公钥和签名信息几乎不同。唯一相同的是三款App的签名的开始一些比特,可能是因为有的信息相同,具体不得而知。

四、同一款App的不同版本签名信息有关系吗?

为了说明这个问题,我们对QQ的两个版本做了检测,情况如下:

QQ4.7.0:

 

公钥:a15e........3695

签名:3082........2049

QQ4.6.2:

 

公钥:a15e........3695

签名:3082........2049

说明:QQ的两个不同版本,从CERT.RSA文件中取出的公钥和签名信息,完全相同。说明QQ开发团队始终使用的是一个相同的公私钥对。当然,他们对于不同的版本使用不同的公私钥对也是可以的,也是可能的。这种可能性发生在他们主动更改公私钥对的情况下,也可能发生在他们用不同的环境进行签名的情况下。

五、可以修改META-INFO文件夹下的文件吗?

(1)CERT.RSA,CERT.SF的文件名可以修改。

我们把CERT.SF的文件名改成CERT1.SF,把CERT.RSA的文件名改成CERT1.RSA,原来的Apk文件可以被成功安装。

说明:Android系统在检测的时候,不会一定要找到CERT这种文件名,是按照文件类型来检测的。但是,如果.RSA文件与.SF文件的名字不同,那么就不能成功安装。

(2)添加自己的CERT.SF和CERT.RSA文件到META-INFO文件夹下面,不能成功。

说明:在(1)的基础上,我们执行(2)操作,不能成功安装,这是因为Android系统找不到摘要文件与(2)中添加上的两个文件进行对应。

六、不同的签名应用,得到的结果可能不同。

用Eclipse签名的Apk文件,解析CERT.RSA文件之后得到的结果如下:

用Dodo Apktools签名后的Apk文件解析之后结果如下:

说明:用Dodo签名的解析文件多了后面的扩展部分,但总体内容不变。

七、应用商店用什么方式检测官方版?

豌豆荚推出的洗白白功能很受欢迎,那么他们是如何辨别App的是否是官方出品的呢?

根据搜集到的资料,他们CEO说是这样实现的:将商店里的App与官网上的App签名做对比

 

搜索结果王俊煜的描述,他们是通过将开发者上传的应用与官网上的应用的签名对比是否相同来确定App是否是官方出品的。从上面的分析,我们也可以得出结论,应用商店采用这种方法是最合适的。

分享到:
评论
1 楼 flying6071 2017-08-14  
“(2)CERT.SF:这是对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。
说明:在这一步,即使开发者修改了程序内容,并生成了新的摘要文件,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件(CERT.SF)。系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件(MANIFEST.MF)对应不起来,所以不能通过检验,不能成功安装文件。”

——为什么我使用不同的keystore对同一apk签名 CERT.SF一模一样?你确定你说的对?你试过吗?如果你没试过请你赶快删掉你这种不负责任的文章,别再误人子弟



https://stackoverflow.com/questions/4245303/android-sf-file

The digests in the .SF file are computed by hashing the 3 lines of the corresponding entry in the .MF file. The .RSA (or .DSA) file contains a signature of the .SF file created from the signing private key, along with the public certificate chain of the signing key. The .RSA (or .DSA) file is in a binary (i.e. non-human readable) format that can be programmatically parsed with effort.

相关推荐

    android apk文件里MANIFEST.MF、CERT.SF、CERT.RSA三者的关系(csdn)————程序.pdf

    在Android应用开发中,...理解MANIFEST.MF、CERT.SF和CERT.RSA之间的关系对于开发者调试签名问题或深入理解Android安全机制非常重要。同时,熟悉相关的哈希和加密算法,如SHA-256和RSA,也是保障移动应用安全的基础。

    获取应用签名可复制.zip

    1. **使用APK分析工具**:如JD-GUI或Apktool,可以解析APK文件,提取其中的MANIFEST.MF、CERT.RSA等签名相关文件。这些文件包含了关于签名的详细信息。 2. **解析签名文件**:CERT.RSA文件包含了应用的签名信息,...

    查看应用签名字符串的apk

    3. **解析CERT.RSA**:`CERT.RSA`文件存储了应用的签名信息,包括签名者证书的公钥和签名本身。这个文件是用Base64编码的,可以使用Base64解码器(如在线工具或编程语言内置库)将其转换为可读格式。 4. **提取签名...

    APK签名验证原理及Upgrade DoS漏洞剖析.pdf

    本文将详细阐述Android APK签名验证原理、Upgrade DoS漏洞(升级拒绝服务攻击)的原理及如何修复该漏洞。 APK签名验证原理的讨论将基于以下几个方面:消息摘要、数字签名、数字证书、APK包组成以及签名验证流程。...

    java实现解析apk签名和图标信息

    APK的签名信息位于`META-INF`目录下的`MANIFEST.MF`、`CERT.SF`和`CERT.RSA`文件中。这些文件提供了关于APK的完整性和发行者的详细信息。Java提供了`java.security.cert`包来处理证书和签名。 1. 打开`CERT.RSA`...

    android ROM分解定制签名教程

    这个过程会将每个文件的哈希值与私钥一起加密,生成一个签名文件,通常命名为`META-INF`目录下的`CERT.RSA`。 4. **验证**:当用户尝试刷入ROM时,设备会读取`META-INF/CERT.RSA`,用内置的公钥解密签名,对比解密...

    Android应用签名获取工具

    下面将详细解释Android应用签名的重要性和获取方法,以及与提供的"Android应用签名获取工具"相关的知识点。 首先,了解Android应用签名的重要性: 1. **身份验证**:签名可以验证应用的开发者身份,使用户知道应用...

    安卓Android源码——shoujiyingyeting_7.rar

    其中可能包含MANIFEST.MF文件(列出所有包含的类和资源),CERT.RSA(用于验证应用的签名,确保未被篡改)和CERT.SF(签名的详细信息)。 4. **assets**: 这里存放的是不经过编译的原始文件,如数据库文件、文本...

    HttpCanary CA for Android 1.zip

    在Android应用中,`META-INF` 文件夹内的文件如`MANIFEST.MF`、`CERT.SF`和`CERT.RSA`用于验证APK的完整性和来源。对于HttpCanary,这个文件夹内的证书信息可能用于验证应用的签名,确保其来自可信的开发者,并且未...

    META-INF.rar_analog tv_android

    由于只提供了"META-INF"这一文件夹名,具体的内容可能包括签名文件(MANIFEST.MF,CERT.RSA等)、版本信息(versionCode, versionName等)。如果压缩包内还有其他文件或子目录,它们可能包含应用的资源文件(如XML...

    com.tencent.mtt.apkplugin.ipai12777.zip

    在APK中,META-INF目录通常用于存放签名文件(如MANIFEST.MF、CERT.SF和CERT.RSA),确保应用的完整性和安全性,防止恶意篡改。 综合以上信息,我们可以得出以下知识点: 1. **腾讯MTT**:腾讯MTT是腾讯公司推出的...

    android软件

    `META-INF`中的`MANIFEST.MF`记录了每个库的清单,`CERT.RSA`和`CERT.SF`分别包含了签名证书和签名摘要。 4. **assets**: 这个目录允许开发者存放未经过编译的原始文件,比如JSON数据、字体文件或者音频文件。这些...

    JustTrustMe.7z

    在 APK 包中,META-INF 目录下的文件(如 MANIFEST.MF、CERT.SF 和 CERT.RSA)用于数字签名过程,确保应用未被篡改,是安全的。 结合以上信息,我们可以推测 "JustTrustMe.7z" 包含了一个或多个 Android 应用程序的...

    andorid2.1源码

    这个目录包含了关于APK文件的元数据,如MANIFEST.MF记录了所有包含的类和资源,签名文件(CERT.SF和CERT.RSA)确保了应用的完整性和安全性。 七、dalvik目录 Dalvik虚拟机是早期Android系统中的运行环境,负责执行....

    三星note2相机

    5. **META-INF** 目录:包含了应用签名和版本控制信息,如MANIFEST.MF、CERT.RSA和CERT.SF文件,它们用于验证APK的完整性。 综上所述,替换三星Note2的原生相机需要对Android系统有一定了解,包括APK的结构、签名...

    apk的结构解析

    - **重要性**:签名是确保应用程序来源可信的关键步骤之一。未签名的应用程序无法在Android设备上正常安装。此外,Google Play商店也要求所有上传的应用程序都必须进行数字签名。 ##### 2. res目录 - **功能**:此...

    LYFYLPay.apk.zip

    7. **META-INF**:这个目录包含了与应用签名和构建过程相关的元数据,如MANIFEST.MF文件记录了所有包含的类文件的签名,CERT.RSA和CERT.SF文件则用于验证APK的完整性和安全性。 通过这个压缩包,我们可以看出...

    APP android 测试用例手册.pdf

    数字签名是确认开发者身份的重要方式之一,它对于防止恶意篡改具有重要意义。如果签名不正确或不一致,则可能存在安全风险。 ##### 3. 开发者证书检查 - **使用工具:** `keytool.exe` - **命令示例:** `keytool....

    超級兔子tester

    "超級兔子Tester"是一款专为Android设备设计的性能测试和分析工具,它可以帮助用户评估和优化设备的运行效率。这款应用集成了多种测试模块,包括CPU、内存、GPU、网络速度等方面的性能检测,旨在提供全面的设备性能...

Global site tag (gtag.js) - Google Analytics