java 解析 apk 的签名

      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  联系我~~~~~~

  

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Javaapk-parser库可以解析APK文件并获取以下信息: 1. 应用程序包名 2. 应用程序版本号 3. 应用程序名称 4. 应用程序图标 5. 应用程序权限列表 6. 应用程序组件列表(Activity、Service、Receiver、Provider) 7. 应用程序签名信息 下面是使用apk-parser解析APK文件的示例代码: ```java public static void parseApk(String apkPath) throws IOException { File apkFile = new File(apkPath); if (!apkFile.exists()) { throw new FileNotFoundException("APK file not found!"); } ApkParser apkParser = new ApkParser(apkFile); ApkMeta apkMeta = apkParser.getApkMeta(); System.out.println("Package Name: " + apkMeta.getPackageName()); System.out.println("Version Name: " + apkMeta.getVersionName()); System.out.println("Version Code: " + apkMeta.getVersionCode()); System.out.println("Application Name: " + apkMeta.getLabel()); System.out.println("Application Icon: " + apkMeta.getIcon()); List<Permission> permissions = apkParser.getPermissions(); System.out.println("Permissions:"); for (Permission permission : permissions) { System.out.println(permission.toString()); } List<ActivityInfo> activities = apkParser.getActivities(); System.out.println("Activities:"); for (ActivityInfo activity : activities) { System.out.println(activity.toString()); } List<ServiceInfo> services = apkParser.getServices(); System.out.println("Services:"); for (ServiceInfo service : services) { System.out.println(service.toString()); } List<ReceiverInfo> receivers = apkParser.getReceivers(); System.out.println("Receivers:"); for (ReceiverInfo receiver : receivers) { System.out.println(receiver.toString()); } List<ProviderInfo> providers = apkParser.getProviders(); System.out.println("Providers:"); for (ProviderInfo provider : providers) { System.out.println(provider.toString()); } List<CertificateMeta> certificates = apkParser.getCertificateMetas(); System.out.println("Signatures:"); for (CertificateMeta certificate : certificates) { System.out.println(certificate.toString()); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值