读取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

时间: 2024-11-01 17:44:25

读取Android APK文件签名的方法的相关文章

android apk的签名和权限问题

一. android apk的签名问题(http://blog.csdn.net/lyq8479/article/details/6401093) 1.为什么要给Android应用程序签名?      如果只能用一句简单的话语来回答这个问题的话,我会说:“这是Android系统所要求的”.      Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!Android通过数字签名来

如何给apk文件签名

1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装). 2.签名的步骤 a.创建key b.使用步骤a中产生的key对apk签名 3.具体操作       方法一: 命令行下对apk签名(原理) 1)创建key,需要用到keytool.exe (位于jdk1.6.0_24\jre\bin目录下),使用

在 java 1.8.0 版本的环境下,进行 android apk 的签名操作

注:文章参考了 android 开发者社区的签名指引说明文章,但由于在国内 android 开发者社区已经无法正常访问,因此在这里做下记录. 地址:http://developer.android.com/tools/publishing/app-signing.html#considerations 在开发 android 应用程序的时候,到最后程序都需要进行签名后才可以发布,目前针对 android 应用开发的 ide 一般都会自带了签名的功能,例如 android studio.eclip

Android之apk文件签名——keytool 和 jarsigner

一.生成密钥库将位置定位在jdk的bin文件中,输入以下命名行: keytool -genkey -alias ChangeBackgroundWid get.keystore -keyalg RSA -validity 20000 -keystore ChangeBackgroundWidget.keystore 上面的命令中间不换行,按下"Enter"键,并根据提示填写相关信息,详细信息如下及图1(validity为有效期,这里有效期为20000天):输入keystore密码:再次

Android : apk系统签名的多种方法

方法一:使用自己的Android签名工具给apk重新签名: (1)该目录下有 media.pk8.media.x509.pem.platform.pk8.platform.x509.pem.shared.pk8.shared.x509.pem.testkey.pk8.testkey.x509.pem等签名文件,不同的签名文件,对应不同的权限.Android默认的签名文件为testkey.pk8.testkey.x509.pem. (2) Android自带的签名工具为 signapk.jar,

[Android]使用platform密钥来给apk文件签名的命令

1.使用platform密钥对apk进行签名 1.1.进入<Android_Source_Path>/build/target/product/security,找到[platform.pk8]和[platform.x509.pem]系统密钥. 1.2.进入<Android_Source_Path>/build/tools/signapk找到SignApk.java,执行javac编译成SignApk.class 1.3.运行命令java com.android.signapk.S

Android APK如何签名

Android项目以它的包名作为唯一标识,如果在同一设备上安装两个相同的应用,后面安装的应用就会覆盖前面安装的应用.为了避免这种情况的发生,我们需要对作为产品发布的应用进行签名. 签名其实有两个作用: (1) 确定发布者的身份.防止别人用相同包名来替换你已安装的程序. (2) 确保应用的完整性.签名会对应用包中的每个文件进行处理,以确保程序包中的文件不会被替换. 在应用的开发和调试阶段,Eclipse的ADT插件或ANT工具会自动生成调试证书,对Android应用签名.但是,如果要正式发布一个A

『原』在Linux下反编译Android .apk文件 使用apktool dex2jar JD-eclipse

一.使用apktool 将 apk反编译生成程序的源代码和图片.XML配置.语言资源等文件 具体步骤: (1)下载反编译工具包:apktool 官方的打不开 http://apktool.shoujifans.com/2014/12/21.html 里有网盘下载 需要下载下边两个文件 apktool1.5.2.tar.bz2 apktool-install-linux-r05-ibot.tar.bz2 (2)将下载好的两个包解压到“同一个”文件夹apktool里面. 注意是同一个 (3)在命令行

关于APK文件反编译方法(图文详解)

今天晚上利用个把小时,终于把apk反编译彻底弄明白了,现在详细讲解一下apk反编译的具体过程. 1.下载三个工具 APK Multi-Tool    作用:获取apk的配置资源文件 dex2jar-0.0.9.15  作用:将apk反编译成java源码(classes.dex转化成jar文件) jd-gui 作用:打开上面生成的jar文件(把.apk文件改成.zip或者.rar文件后,用压缩文件打开只能看到大量的.java文件,此时就可以利用此工具打开,就可以看到源代码已经所用到的库文件) [三