java 解析 apk 的签名

原创 2013年12月04日 18:56:08

      java解析apk的签名,是表示这个apk的唯一作者的。里面涉及到很多什么 私钥 公钥 之类的东西,反正是涉及的很严密,在网上的相关文档也不是很少。 说白了,就是不能轻易的让其他人去修改的你的签名,不能去修改的apk。要是修改了,签名就会发生变化,知道不是原生作者。我们就是为了判断一个apk的包,是否是原来的作者,就写一个java的自动解析apk的签名的东西。获取到之后,当下次软件升级更新的时候,判断签名是否匹配,否则,不予以升级、更新之类的。

     网上写java获取apk签名的方式主要有两种,

  (1)、解压apk包,在里面找到一个.RSA文件,然后进行解析。

    

    import sun.security.pkcs.PKCS7;  
    import java.io.FileInputStream;  
    import java.io.FileNotFoundException;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.security.GeneralSecurityException;  
    import java.security.cert.X509Certificate;  
    public class SignApk {  
        public static X509Certificate readSignatureBlock(InputStream in) throws IOException, GeneralSecurityException {  
            PKCS7 pkcs7 = new PKCS7(in);  
            return pkcs7.getCertificates()[0];  
        }  
        public static void main(String[] args) throws FileNotFoundException, IOException, GeneralSecurityException {  
            X509Certificate publicKey = readSignatureBlock(new FileInputStream("./CERT.RSA"));  
            System.out.println("issuer:" + publicKey.getIssuerDN());  
            System.out.println("subject:" + publicKey.getSubjectDN());  
            System.out.println(publicKey.getPublicKey());  
        }  
    }  
 如初如下:

issuer:CN=Sodino  
subject:CN=SodinoChen  
Sun RSA public key, 1024 bits  
  modulus: 154308594144468705348294760484396264219304223307125368116140288659005422830114898674784044956357283073098453132761265419031547660249768235885852151387544779929680291539693130807734777897342583741160281523340554669518353638961667015615312475350767041053961957188628650343640790505255765999004862716823611888529  
  public exponent: 65537 


  (2)、就是利用cmd指令,也就是 jarsigner  指令获取。

jarsigner -verify -verbose -certs <your_apk_path.apk>   
 以上的详细,来自CSDN   http://blog.csdn.net/sodino/article/details/6149706 的文章,感谢他的帮助。


由于是我们上传apk,如果解压解析的话,就有点过分了,破坏了apk不说,还要删除解压之后的文件,有些繁琐,而且操作复杂,不适合我们。所以,决定使用第二种方法,就是cmd指令, 然后,让java去调用 cmd的指令,然后打印返回信息进行解析。获取自己想要的信息。

现在是贴出来最主要的方法:


package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;




public class newtest3 {
	public static void main(String[] arg)
	  {  
		String apkUrl = "C:\\Users\\Administrator\\Desktop\\com.taobao.taobao_淘宝.apk";
		String apkUrl1 = "C:\\Users\\Administrator\\Desktop\\sign.apk";
		String result = getSingle(apkUrl);
		String result2 = getSingle(apkUrl1);
		System.out.println(result+"~"+result2);
	  }  
	
	
	public static String getSingle(String apkUrl){
        Process p;  
        //test.bat中的命令是ipconfig/all 
        String cmd = "jarsigner -verify -verbose -certs " + apkUrl;
//        String cmd="jarsigner -verify -verbose -certs C:\\Users\\Administrator\\Desktop\\PandaClient.apk";  
        String resultstr = null;
        try   
        {  
            //执行命令  
            p = Runtime.getRuntime().exec(cmd);  
            //取得命令结果的输出流  
            InputStream fis=p.getInputStream();  
            //用一个读输出流类去读  
            //用缓冲器读行  
            BufferedReader br=new BufferedReader( new InputStreamReader(fis,"GB2312"));  
            String line=null;  
            //直到读完为止  
            int i = 0;
            while((line=br.readLine())!=null)   
            {  
            	if(line.contains("X.509")){  //解析符合自己需要的內容,获取之后,直接返回。
//                	 System.out.println(line); 
            		resultstr = line;
                	 break;
            	}
                i++;
            }  
        }   
        catch (IOException e)   
        {  
            e.printStackTrace();  
        }  
        return resultstr.replace("      X.509, ", "");
	}
}

以上主要的代码是, 边界一个在cmd 要执行的 一个字符串,路径别忘了转移字符啊。 然后让java去执行cmd,获取返回的内容。 匹配,当获得自己想要的 我的字符串开头是

X.509为开头的。当获取到之后,就立刻跳出循环。处理获取到的字符串,然后直接返回就好了。 

就是这些了,希望这些代码对读者有帮助哈            有问题的话,可以:2281879713  联系我~~~~~~

  

JAVA 读取APK包信息以及签名信息

本段代码能够读取APK的版本、包名、签名信息 package com.sg.util; import java.io.File; import java.io.IOException; imp...
  • w13770269691
  • w13770269691
  • 2013年02月22日 16:39
  • 10452

Android之Keystore文件签名(获取查看apk签名)

Android应用开发的时候会经常使用到第三方SDK,例如地图、推送、支付以及分享等。而这些第三方服务SDK为了应用不被滥用都会有签名验证机制。我们通过上传Android应用的签名来在服务端配置以验证...
  • jdsjlzx
  • jdsjlzx
  • 2016年08月07日 21:02
  • 18550

Java实现Android APK多渠道打包

使用Android Studio开发的朋友都知道,Gradle自带多渠道打包的功能,但是此功能较慢,对于我们这种近百个的渠道包来说,打包无疑是种痛苦。对于爱学习的我来说,自己动手写一份多渠道打包程序,...
  • MonchChen
  • MonchChen
  • 2016年03月07日 17:39
  • 1435

java 实现解析apk的包名和版本号

java 实现解析apk的包名和版本号package com.util;import java.util.Enumeration; import java.util.HashMap; import j...
  • u012235651
  • u012235651
  • 2017年06月14日 09:29
  • 886

Java Web学习(apk)

  • 2014年03月31日 13:57
  • 8.62MB
  • 下载

java语言实现apk文件的压缩和解压缩

  • 2013年07月02日 15:05
  • 5KB
  • 下载

纯JAVA环境获取APK信息(包名,版本,版本号,大小,权限...),纯JAVA语言编写PC端获取APK信息

纯JAVA环境获取APK信息(包名,版本,版本号,大小,权限...)
  • Chillax_li
  • Chillax_li
  • 2014年12月10日 23:23
  • 6509

在cmd环境下创建、编译、打包android应用程序

1)创建android应用程序(以HelloWorld为例): 命令中各个参数的意义可以通过android --help create project命令查看 2)生成R.java文件...
  • ygc87
  • ygc87
  • 2012年05月31日 19:44
  • 5177

apk打包之用纯命令行打包apk(android4.4亲测可用)

现在小型程序的打包基本上用IDE完成了 所以久而久之很多人都不会最基础的打包方式,现在就来捋顺关系 首先是步骤 ,网上最少有三步,最多有8步,其中一些函数都已经被废弃,所以,笔者选择比较通用的6步 ...
  • killer1989
  • killer1989
  • 2015年07月17日 15:21
  • 4034

jni中调用java方法获取当前apk的签名文件md5值

jni中调用java方法获取当前apk的签名文件md5值
  • lgl1170860350
  • lgl1170860350
  • 2015年06月03日 22:32
  • 1780
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 解析 apk 的签名
举报原因:
原因补充:

(最多只允许输入30个字)