读取Android APK文件签名的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读取Android APK文件签名的方法相关的知识,希望对你有一定的参考价值。

在微信开放平台等申请API key 和secret时经常要用到apk文件签名,那么如何读取呢?

下面贴一下相关读取源码:

一共两个文件MainActivity和MD5,

package com.lcg.gensinature;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.os.Bundle;
import android.text.ClipboardManager;
import android.text.Editable;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity
{
  private Button mCopyBtn;
  private Button mGenBtn;
  private EditText mPackageEt;
  private TextView md5SignTv;

  public static byte[] getSign(Context paramContext, String paramString)
  {
     
      PackageInfo localPackageInfo;
      int i;
      byte[] arrayOfByte;
      try
      {
        localPackageInfo = paramContext.getPackageManager().getPackageInfo(paramString, 64);
        i = 0;
        if (i >= localPackageInfo.signatures.length)
        {
           
          return null;
        }
        System.out.println(i);
        arrayOfByte = localPackageInfo.signatures[i].toByteArray();
        System.out.println(arrayOfByte);
        return arrayOfByte;
      }
      catch (PackageManager.NameNotFoundException localNameNotFoundException)
      {
        return null;
      }
     
      
     
  }

  protected void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    setContentView(R.layout.activity_main);
    this.mPackageEt = ((EditText)findViewById(R.id.pkgNameEt));
    this.mGenBtn = ((Button)findViewById(R.id.getBtn));
    this.mGenBtn.setOnClickListener(new View.OnClickListener()
    {
      public void onClick(View paramView)
      {
        String str1 = MainActivity.this.mPackageEt.getText().toString();
        if (TextUtils.isEmpty(str1));
        byte[] arrayOfByte;
        
        	arrayOfByte = MainActivity.getSign(MainActivity.this.getApplicationContext(), str1);
          
        
        String str2 = "";
        try
        {
          str2 = MD5.hexdigest(arrayOfByte);
          Log.d("genSinature", "gen md5=" + str2);
          System.out.println(str2);
          MainActivity.this.md5SignTv.setText(str2);
          
          ClipboardManager cmb = (ClipboardManager)MainActivity.this.getSystemService(MainActivity.this.CLIPBOARD_SERVICE);  
  		cmb.setText(str2); 
  		Toast.makeText(MainActivity.this, "已经复制到剪贴板", 1).show();
          return;
        }
        catch (Exception e)
        {
        	e.printStackTrace();
        }
      }
    });
    this.md5SignTv = ((TextView)findViewById(R.id.resultTv));
    
    showDialog();
  }
  
  
  private void showDialog()
  {
    AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);
    localBuilder.setCancelable(false);
    localBuilder.setTitle("警告?").setMessage("将读取APP信息");
    localBuilder.setPositiveButton("拒绝", null);
    localBuilder.setNegativeButton("同意", new DialogInterface.OnClickListener()
    {
      public void onClick(DialogInterface paramDialogInterface, int paramInt)
      {
        MainActivity.this.finish();
      }
    });
    localBuilder.show();
  }
}
 

  

package com.lcg.gensinature;

import java.security.MessageDigest;

public class MD5
{
  private static final char[] hexDigits = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102 };

  public static String hexdigest(String paramString)
  {
    try
    {
      String str = hexdigest(paramString.getBytes());
      return str;
    }
    catch (Exception localException)
    {
    }
    return null;
  }

  public static String hexdigest(byte[] paramArrayOfByte)
  {
    try
    {
      MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
      System.out.println(paramArrayOfByte);
      localMessageDigest.update(paramArrayOfByte);
      byte[] arrayOfByte = localMessageDigest.digest();
      System.out.println(arrayOfByte);
      
      char[] arrayOfChar = new char[32];
      int i = 0;
      int j = 0;
      for(i=0;i<16;i++){
      
      int k = arrayOfByte[i];
      int l = j + 1;
      arrayOfChar[j] = hexDigits[(0xF & k >>> 4)];
      j = l + 1;
      arrayOfChar[l] = hexDigits[(k & 0xF)];
      }
      if (i >= 16)
          return new String(arrayOfChar);
    }
    catch (Exception e)
    {
    	e.printStackTrace();
    }
    return null;
  }
}
 

  更多精彩内容请访问 http://www.leegtang.com

以上是关于读取Android APK文件签名的方法的主要内容,如果未能解决你的问题,请参考以下文章

Apk去掉签名以及重新签名的方法

简单快速的Android打渠道包的方法

Android程序的签名保护及绕过方法

eclipse将android项目生成apk并且给apk签名

如何判断 Android 应用的 Apk 签名是不是一致?

Android实践 -- 对apk进行系统签名