`
xuanzhui
  • 浏览: 201444 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

安卓签名文件及解析

阅读更多

1. Android Studio默认的apk打包文件地址

用户根目录/.android/debug.keystore

Android Studio - debug keystore

Where the debug.keystore in Android Studio

 

Eclipse ADT基本一致:Windows->Preference->Android->Build 可以查看

 

2. 通过keytool计算apk的签名

对于jdk7及以上版本可以直接通过如下命令

keytool -list -printcert -jarfile apk_file_path

 

如果有keystore文件

keytool -list -keystore file_path

 默认的debug.keystore密码为android

I have never set any passwords to my keystore and alias, so how are they created

 

如果知道keystore的alias和密码,可以显示更详细的信息

keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android -v

 

对于jdk7以下的版本,可以先解压apk,对目标文件META-INF/CERT.RSA计算签名 

keytool -printcert -file file_path

 

How to find out which key was used to sign an app

How to get the certificate signing information from an Android APK

How can I verify the authenticity of an APK file I downloaded(对RSA文件有个简短的介绍)

 

 

3. 在android运行时计算apk的签名

/*
standard MessageDigest algorithms:
MD5
SHA-1
SHA-256
 */
private String getCertificateFingerprint(Context mContext, String algorithm, String packageName) {
    PackageManager pm = mContext.getPackageManager();
    int flags = PackageManager.GET_SIGNATURES;
    PackageInfo packageInfo = null;
    try {
        packageInfo = pm.getPackageInfo(packageName, flags);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

    if (packageInfo == null)
        return null;

    Signature[] signatures = packageInfo.signatures;
    //此处我直接默认只有一个签名
    byte[] cert = signatures[0].toByteArray();
    InputStream input = new ByteArrayInputStream(cert);
    CertificateFactory cf = null;
    try {
        cf = CertificateFactory.getInstance("X509");
    } catch (CertificateException e) {
        e.printStackTrace();
    }

    if (cf == null)
        return null;

    X509Certificate c = null;
    try {
        c = (X509Certificate) cf.generateCertificate(input);
    } catch (CertificateException e) {
        e.printStackTrace();
    }

    if (c==null)
        return null;

    String hexString = null;
    try {
        MessageDigest md = MessageDigest.getInstance(algorithm);
        byte[] publicKey = md.digest(c.getEncoded());
        hexString = byte2HexFormatted(publicKey);
    } catch (NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    } catch (CertificateEncodingException e) {
        e.printStackTrace();
    }
    return hexString;
}

public static String byte2HexFormatted(byte[] arr) {
    StringBuilder str = new StringBuilder(arr.length * 2);
    for (int i = 0; i < arr.length; i++) {
        String h = Integer.toHexString(arr[i]);
        int l = h.length();
        if (l == 1) h = "0" + h;
        if (l > 2) h = h.substring(l - 2, l);
        str.append(h.toUpperCase());
        if (i < (arr.length - 1)) str.append(':');
    }
    return str.toString();
}

Get certificate fingerprint from android app

How to read SHA and MD5 fingerprint programmatically in Android

第二个链接提及了一个开源项目 apk-parser

 

4. 直接通过java程序获取

1) 读取apk中的RSA签名文件

ZipFile zipFile = new ZipFile("demo-debug.apk_2.0.4.apk");

Enumeration<? extends ZipEntry> entries = zipFile.entries();

while(entries.hasMoreElements()){
    ZipEntry entry = entries.nextElement();
    if (entry.getName().endsWith("RSA")) {
        ZipEntry entry = entries.nextElement();
    	//TODO with  zipFile.getInputStream(entry)
    }
}

 

Read Content from Files which are inside Zip file

 

 

2) 计算RSA文件签名

public static String[] getSign(InputStream input, String algorithm) throws CertificateException, NoSuchAlgorithmException {
    CertificateFactory cf = CertificateFactory.getInstance("X509");
    
    Collection<? extends Certificate> c = cf.generateCertificates(input);
   
    Certificate[] certs = c.toArray(new Certificate[c.size()]);
    
    String[] hexString = new String[certs.length];
    
    for (int i=0; i<certs.length; i++) {
    	X509Certificate x509Cert = (X509Certificate)certs[i];
    	
        MessageDigest md = MessageDigest.getInstance(algorithm);
        byte[] publicKey = md.digest(x509Cert.getEncoded());
        //byte2HexFormatted和android那边的一致
        hexString[i] = byte2HexFormatted(publicKey);
    }
    
    return hexString;
}

 主要参考了java KeyTool源码,可以搜索printcert,其中printCertFromStream是主要需要关注的函数

private void printCertFromStream(InputStream in, PrintStream out)

 

相关的一个开源项目android-apk-parser 

 

 

 

分享到:
评论

相关推荐

    java生成及验证android签名文件源码及生成签名文件

    本文将深入探讨Java如何生成及验证Android签名文件,并解析源码中的相关概念。 首先,让我们理解Android签名文件的核心作用。Android签名文件(通常为`.keystore`格式)是一个包含了应用开发者私钥的加密文件,用于...

    Android签名证书文件的解析和签名校验的加强

    #### 二、Android签名证书文件解析方法 对于Android签名证书文件的解析,主要有以下几种途径: 1. **使用Android提供的解析类**:这是最直接也是最便捷的方式,适用于Android平台上的开发。 2. **利用Java提供的...

    Gen_Signature_Android 签名解析工具

    Gen_Signature_Android是一个专门用于Android应用签名解析的工具,它可以帮助开发者和安全研究人员深入理解APK文件的签名机制,以及验证APK的签名信息。下面将详细介绍Android应用的签名过程、签名的重要性以及如何...

    Android so文件签名验证源代码

    1. 读取SO文件的证书信息:这部分代码会解析.so文件,提取其中的数字签名。 2. 获取APK的证书信息:这一步是从APK的META-INF目录下的CERT.RSA文件中获取签名信息。 3. 比较两个证书:如果两者匹配,说明SO文件和APK...

    apktool(包含签名文件)

    1. 签名文件(.keystore)非常重要,包含开发者身份信息,应妥善保管,避免丢失或被盗。 2. 修改过的APK可能需要适配原应用的版本号和签名,否则可能会导致升级失败或其他兼容性问题。 3. 反编译和重新打包操作可能...

    解析yml、yaml的工具类库文件

    Apktool是一个流行的Android应用反编译工具,它可以解包APK文件,提取其中的资源和代码,并允许开发者重新打包和签名。Apktool.yml文件可能是Apktool在处理APK时生成或使用的配置文件,用于记录反编译过程中的元数据...

    安卓固件签名工具.zip

    2. **signapk.jar**:这是Android签名的主要工具,由Google提供。它使用Java编译并运行,可以对APK或者系统图像进行签名。SignApk需要两个密钥文件(`.x509.pem`和`.pk8`)来对APK进行签名,生成一个新的APK,其中...

    android签名工具.zip

    1. **解压文件**:首先,你需要解压缩"android签名工具.zip",得到可执行的安卓应用。 2. **安装应用**:将解压后的应用安装到你的Android设备上。 3. **输入包名**:打开应用后,输入你想要获取签名的APK的包名...

    Android反编译并签名打包需要的文件

    - 使用工具如`Apktool`,它能够解析APK的资源文件和二进制XML,将其转换为人类可读的格式。首先,你需要下载并安装Apktool,然后运行相应的命令来解包APK。 - 命令示例:`apktool d yourapk.apk -o output_...

    【android开发】手写签名系统的设计与实现之实现解析pdf文件(二)

    1. **PDF文件解析**: PDF(Portable Document Format)是一种通用的文件格式,用于保持文档的布局和内容不变。在Android中,由于原生SDK并不支持PDF解析,我们需要借助第三方库。这里提到的是`libmupdf.so`,这是...

    APK签名解析示例

    - **signed_logcat.apk**:这是已经签名的APK文件,可以被安装到Android设备上。 - **sign.cmd**:这可能是一个批处理脚本,用于自动化签名过程。它可能包含了调用Signapk工具(signapk.jar)和Keytool的命令。 - **...

    安卓 Android系统获取包名、平台公钥、签名 MD5 值的指引以及工具

    jadx-gui 安卓 Android系统获取包名、平台公钥、签名 MD5 值, pepk.jar 生成的签名密钥指引以及工具。...把Pepk.jar和你项目的签名文件(xxx.jks)复制到JDK的bin目录下,运行命令打包、加密签名密钥文件

    android 系统签名工具

    一、Android签名机制 Android系统的签名机制是为了保证应用的完整性和防止篡改。每个APK文件在打包后都会包含一个数字签名,这个签名验证了应用的代码和资源没有被修改过。当用户尝试安装应用时,Android系统会检查...

    批处理 一键 apk反编译、编译、签名(已生成签名文件)。

    每个开发者都应该有自己的签名文件,因为一旦应用发布,应该始终使用同一签名文件更新应用,否则系统将识别为不同的应用,导致用户无法自动更新。 5. **最新.txt**:这个文件可能包含了关于反编译、编译和签名过程...

    APP获取安卓签名工具

    在Android平台上,应用程序的签名是安全性和权限管理的重要组成部分。签名不仅验证了应用程序的来源,还确保了应用程序的完整性和可更新性。本资源“APP获取安卓签名工具”旨在帮助开发者或用户方便地获取已安装在...

    新浪微博签名apk

    而安装签名apk则是指使用特定的签名文件对apk进行签名,以便在设备上安装和运行。 使用“新浪微博签名apk”,开发者需要特别注意输入正确的包名。包名在Android开发中是一个全局唯一的标识符,由一系列小写的反向...

    Android签名工具

    本文将详细解析“Android签名工具”及其重要性,以及如何使用这类工具对APK进行签名或重签名。 首先,理解Android签名的概念。Android签名是为了确保应用的完整性和开发者身份的一种机制。每个APK在发布前都需要...

    android mupdf droidtext0.5 PDF手写签名

    此外,我们将详细解析如何实现签名的缩放以及撤销操作。 首先,Mupdf是一个开源的轻量级PDF阅读器库,由Artifex Software开发。它提供了基本的PDF查看、导航和渲染功能,是许多移动应用中的首选PDF处理库。在...

    Android 签名板

    这个"Android签名板"项目,从其标题和描述来看,似乎是一个轻量级的Android库,旨在帮助开发者快速集成签名和画板功能。博客链接虽然未提供具体细节,但通常会包含项目的使用方法、API介绍以及示例代码等。 首先,...

    Java代码解析指定apk文件

    在Android开发领域,APK文件是应用程序的二进制包,包含了应用的所有资源、代码、配置文件等。本文将深入探讨如何使用Java代码解析指定的APK文件,从而获取其中的关键信息。 首先,理解APK文件的结构至关重要。APK...

Global site tag (gtag.js) - Google Analytics