[Android Pro] Android签名与认证详细分析之二(CERT.RSA剖析)

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介:


              http://blog.csdn.net/u010571535/article/details/8992543#

一、Android证书的格式

Android签名中证书的格式采用X.509标准的版本三,不过省略了一些内容。

X.509证书格式如下图所示:

二、证书的格式示例

从Chrome浏览器中导出一个证书,打开之后的样子如下图所示:

说明:由上图可以看出,在证书中,开发者的公钥是显式存在的。

三、对CERT.RSA进行详细解析

重要说明:编写Java程序和编写Android应用App解析Apk的CERT.RSA文件,得到的结果是不一样的。按道理,都是解析的同一个文件,为什么结果不一样呢?经过我们分析,发现不一样的地方是开发者公钥,但是这是由于二者的显示格式不同导致的。App解析得到的文件时十六进制显示的,而Java解析得到的结果却是十进制显示的。我们利用Java的BigInteger编写程序,将十六进制转换为十进制,验证了我们的猜想。

明确了上面的问题之后,对CERT.RSA 文件进行详细解析,得到下图:

说明:

(1)首先,我们的通常所说的证书的签名,是生成证书的时候CA对整个证书的所有域签名的得到的,而不是对某一部分签名得到的。整个签名就是上图中部分一的最下面的一段十六进制的内容;

(2)编程中的获取到的内容实质上是就是上图中的部分二,这是一个证书的所有内容;

(3)部分一种的公钥等信息就是从部分二中得来的,可以直接在部分二中找到。

(4)可以猜测,部分一中的其他信息也是从部分二中得来,只不过编码方式不一样,所以显示不同而已。

-----------------------------------------------------------------------------------------------------------

 

可以通过: openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text  将 CERT.RSA证书中的内容答应出来。

复制代码

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1005375368 (0x3beccf88)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Android, CN=Android Debug
        Validity
            Not Before: Dec 29 10:10:49 2014 GMT
            Not After : Dec 21 10:10:49 2044 GMT
        Subject: C=US, O=Android, CN=Android Debug
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:d8:b9:a8:66:5f:09:b0:04:86:3f:23:9e:c2:84:
                    93:a0:e3:dc:a2:5f:d3:ab:48:29:e9:e6:33:16:69:
                    56:87:4f:34:41:ce:be:3e:d0:a4:fa:33:27:e7:79:
                    7d:d3:0b:63:22:d3:27:f9:7b:f2:23:30:23:13:39:
                    24:4c:92:f2:15:60:35:ed:91:87:77:86:e7:f0:df:
                    2d:93:fd:59:26:86:93:4e:e5:13:e2:bf:55:5a:6a:
                    e7:3d:ac:48:50:10:d4:96:71:2d:c7:f9:df:91:0b:
                    b8:b0:0f:8d:b9:f2:8f:ec:65:33:c6:6c:a9:79:b1:
                    da:74:d1:0f:cc:7a:c3:ed:d1:a2:85:42:86:ae:88:
                    2a:dd:3c:8b:b0:d5:e5:45:07:42:a0:96:65:b4:ac:
                    2f:98:7e:8a:36:2f:b8:0d:a7:1c:0f:38:f1:56:9c:
                    13:f6:3c:a0:2c:f7:a9:e8:cb:17:95:44:4f:dc:e2:
                    ce:b7:9e:a3:f8:c2:fa:71:c0:f0:20:76:29:34:34:
                    d9:e0:18:12:f9:ec:40:a9:2a:f1:39:cd:30:43:da:
                    de:92:71:92:88:fd:28:0a:17:b7:cd:c8:d8:fb:45:
                    ca:1c:61:bc:13:91:2e:01:b2:20:36:1b:18:b8:aa:
                    e0:95:e0:ab:98:fa:9c:1b:6b:7f:bd:27:66:ab:5e:
                    d0:9b
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                A5:02:31:28:2E:76:1B:10:11:68:AD:32:5C:8F:DC:00:30:80:BB:7C
    Signature Algorithm: sha256WithRSAEncryption
         ba:0d:dc:9a:f9:12:97:12:b0:7c:d6:07:e7:bd:27:32:46:60:
         75:4b:e3:b4:3e:09:f7:90:53:cd:4d:f5:bf:61:3f:2a:2e:2f:
         d0:c8:50:c2:3b:29:62:10:25:7d:6b:53:48:88:e1:76:60:33:
         52:45:ac:df:5f:49:95:ee:ac:75:81:14:46:2f:e0:26:30:be:
         d8:5d:2b:1c:a2:2f:30:34:c9:f4:9c:e4:c4:86:54:71:69:3d:
         de:2d:97:fe:dc:68:9f:13:d0:b9:86:e8:24:b9:75:04:cf:db:
         1d:cf:d0:36:db:06:b9:87:37:3c:89:25:02:12:8b:fc:42:9e:
         5e:18:69:25:5f:2a:52:ab:5a:a1:19:f6:3f:3b:9c:d3:5d:bd:
         ce:0b:5d:a0:f9:d6:0b:de:05:ff:89:24:b3:ad:9b:4e:5c:9f:
         07:c2:b2:d9:55:44:49:e7:b7:cf:a2:ca:68:ae:64:0d:8a:56:
         43:9b:de:ad:e5:d6:d5:86:76:ba:34:d4:90:e8:0a:ba:26:73:
         8c:4b:7d:8c:92:02:bb:62:2c:9b:83:e8:d3:2f:74:01:72:89:
         b4:a2:08:12:c3:64:90:40:b2:8e:60:fd:db:6b:08:a7:db:32:
         98:f7:7a:ce:c9:78:46:42:7d:09:31:6a:5f:b8:81:87:2f:62:
         1e:e2:d3:7d

复制代码

Java

这是最简单的

复制代码

import sun.security.pkcs.PKCS7;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class Test {
    public static void main(String[] args) throws CertificateException, IOException {
        FileInputStream fis = new FileInputStream("/Users/wangchen/Desktop/CERT.RSA");
        PKCS7 pkcs7 = new PKCS7(fis);
        X509Certificate publicKey = pkcs7.getCertificates()[0];

        System.out.println("issuer1:" + publicKey.getIssuerDN());
        System.out.println("subject2:" + publicKey.getSubjectDN());
        System.out.println(publicKey.getPublicKey());
    }
}

复制代码

使用openssl-dev 的C API

复制代码

#include 
#include 
#include 
#include <string>
#include 
using namespace std;
string to_string(X509_NAME* name)
{
    BIO* mem = BIO_new(BIO_s_mem());
    if (mem == NULL)
        return NULL;

    if (X509_NAME_print_ex(mem, name, 0, XN_FLAG_RFC2253) < 0)         return NULL;     string str;     char buf[128];     while((BIO_gets(mem, &buf[0], sizeof(buf))) > 0)
    {
        str.append(buf);
    }
    BIO_free(mem);
    return str;
}

int main()
{
    FILE* fp;
    if (!(fp = fopen("CERT.RSA", "rb")))
    {
        fprintf(stderr, "Error reading input pkcs7 file\n" );
        exit(1);
    }
    /* todo: 这里可能有内存漏洞,有空查一下文档 */
    PKCS7* pkcs7 = d2i_PKCS7_fp(fp, NULL);
    X509* cert = sk_X509_pop(pkcs7->d.sign->cert);
    string subject = to_string(X509_get_subject_name(cert));
    string issuer = to_string(X509_get_issuer_name(cert));
    char *modulus = BN_bn2dec(X509_get_pubkey(cert)->pkey.rsa->n);
    cout << subject << endl;
    OPENSSL_free(modulus);
    fclose(fp);
    return 0;
}

复制代码

 

 分类: Android Pro

 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/4482667.html如需转载请自行联系原作者  


demoblog

相关文章
|
20天前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
86 4
|
1月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
12天前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
21 8
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
69 15
Android 系统缓存扫描与清理方法分析
|
15天前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
21 1
|
2月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
21天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
8天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
35 19
|
8天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
32 14