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

  • 相关阅读:
    线程join
    java线程 WaitAndNotify
    java线程死锁
    多线程并发的3个特性
    常用字符串搜索算法介绍
    [原创]ASP.NET网站中获取当前虚拟目录的应用程序目录的方法
    [原创]字符串多模匹配算法之AC自动机理解心得
    客户端javascript访问服务器控件的方法
    [总结]C++实现一个限制对象实例个数的类
    [原创]我的北大ACM POJ1001解答
  • 原文地址:https://www.cnblogs.com/leegtang/p/5560385.html
Copyright © 2020-2023  润新知