`
xuanzhui
  • 浏览: 196979 次
  • 性别: 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 

 

 

 

分享到:
评论

相关推荐

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

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

    (解压密码1234)安卓APK混淆加固重签名工具1.6.5

    安卓APK资源混淆加密重签名工具,可以对安卓APK文件的代码和资源文件进行混淆加密处理,可以对安卓APK文件进行加固,对代码和资源文件进行混淆,重新签名等功能. 可以保护APK,增加破解难度,防止误报毒等功能. ...

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

    上一篇文章,我们介绍了如何去实现读取手机文件及文件夹,并以列表的形式显示出来,今天我们将说说如何读入pdf文件。具体请参照博客:http://blog.csdn.net/acrambler

    apk文件进行解析,跟大家分享一下

    apk.zip 最近需要,顺便把学到的相关知识跟大家分享一下 主要内容如下: ...3、apk签名文件转换:jks和keystore相互装换 4、查看签名文件的信息 5、adb方式和java代码方式查看apk签名信息:MD5,SHA1,SHA256

    安卓文件下载上传解压相关-android检测版本自动更新并弹出对话框提示用户下载带有进度条服务端解析xml已测过好多次主要包名更签名.rar

    android检测版本自动更新并弹出对话框提示用户下载,带有进度条,服务端解析xml,已测过好多次,主要包名更签名.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    android开发入门教程

    目录 第1章 掀起你的盖头来——初识Android 1.1 认识Android 1.2 Android的背景 1.2.1 Android的历史 1.2.2 Android的发展 ...4.5.2 卖东西也要签名——生成签名文件 4.5.3 打包、签名、发布应用 4.6 本章小结

    最新安卓APK资源混淆加密重签名工具v1.7.9 牛!

    安卓APK资源混淆加密重签名工具,可以对安卓APK文件的代码和资源文件进行混淆加密处理,可以对安卓APK文件进行加固,对代码和资源文件进行混淆,重新签名等功能. 可以保护APK,增加破解难度,防止误报毒等功能. ...

    解决android中混淆代码签名导出报错的proguard.cfg

    解决android中混淆代码签名导出报错的proguard.cfg 第三方jar包,可类似 -libraryjars libs/android-support-v4.jar 添加在文件中

    安卓apk查看器

    安卓apk查看器 apk解析器 apk文件解密 apk签名读取

    android在线版本更新源代码(update,json解析带注释)

    这里共享一个android在线版本更新的代码,本代码采用json解析版本控制文件,有注释,希望大家批评指正。 注意:版本更新需要对apk文件进行签名!

    android自动检测版本并更新下载,带进度条服务端解析xml

    android检测版本自动更新并弹出对话框提示用户下载,带有进度条,服务端解析xml,已测过好多次,主要包名更签名!

    安卓反编译工具DoAPK

    也有程序直接把文字写在java程序了,所以在smali目录下也可能会有一些,smali目录的.smali文件是对java文件的解析,不能瞎改,汉化的话要注意,搜索整个目录,找到你要汉化的文字,替换成就行,注意,里面的参数别瞎改,不然...

    apktoolbox

    apk反编译工具可以有效地对apk文件反编译,帮助你解析apk文件,并对相应的文件进行修改,不仅如此它还可以修改签名、反编译dex等,十分实用。 apk反编译工具安装方法: 把文件都解压放在同一个目录,共三个文件 ...

    【推荐】超全的移动安全自学资料精编合集(43份).zip

    Android安全安全技术: 基础文件格式解析 Android安全安全技术: Android应用安全防护技术 Android安全安全技术: 其他Android安全知识总结 Android安全开发基础: 开发基础常识 Android安全开发基础: 四大组件之活动...

    android开发入门与实战(下)

    4.5.2 卖东西也要签名——生成签名文件 4.5.3 打包、签名、发布应用 4.6 本章小结 第5章 千里之行始于足下——第一个应用HelloWorld 5.1 HelloWorld应用分析 5.1.1 新建一个Android工程 5.1.2 填写工程的信息 5.1.3...

    android开发入门与实战(上)

    4.5.2 卖东西也要签名——生成签名文件 4.5.3 打包、签名、发布应用 4.6 本章小结 第5章 千里之行始于足下——第一个应用HelloWorld 5.1 HelloWorld应用分析 5.1.1 新建一个Android工程 5.1.2 填写工程的信息 5.1.3...

    《Google Android开发入门与实战》.pdf

    4.5.2 卖东西也要签名——生成签名文件 46 4.5.3 打包、签名、发布应用 48 4.6 本章小结 51 第5章 千里之行 始于足下——第一个应用helloworld 52 5.1 helloworld应用分析 52 5.1.1 新建一个android...

    Android应用安全防护和逆向分析

    基础篇包括第1~7章,主要介绍移动应用安全的基础知识,包括Android中NDK开发知识、逆向中需要用到的命令、编译之后的apk包含的四类主要文件格式解析等。防护篇包括第8~14章,主要介绍移动应用安全防护的相关技术,...

    查看安卓APP信息

    1. 查看Apk 的元信息,如标题、图标、SDK版本、权限、支持的语言等 2. 解析Apk 中任意的Binary Xml 文件,翻译成可读的Xml 文本 3. 查看Apk Dex 文件中包含的Class 信息 4. 验证Apk 签名,查看签名的信息

    Android代码-XHttp2 一个功能强悍的网络请求库

    支持任意数据结构的自动解析。 支持添加动态参数例如timeStamp时间戳、token、签名sign。 支持自定义的扩展API。 支持多个请求合并。 支持Cookie管理。 支持异步、同步请求。 支持Https、自签名网站Https的访问、...

Global site tag (gtag.js) - Google Analytics