读取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文件签名的方法的更多相关文章
- android apk的签名和权限问题
一. android apk的签名问题(http://blog.csdn.net/lyq8479/article/details/6401093) 1.为什么要给Android应用程序签名? ...
- apk文件签名绕过
声明: 1.本文转载自:http://www.2cto.com/Article/201311/256406.html,为了留作日后参考上传博客 2.如有转载请复试上面连接,尊重原创 apk文件签名绕过 ...
- 如何给apk文件签名
1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...
- Visual Studio 2017为Android APK包签名
Visual Studio 2017为Android APK包签名 为Android APK包签名,可以保证后期的App顺利升级.在Visual Studio 2015中,IDE会自动生成两个AP ...
- Android之APK文件签名——keytool和jarsigner
一.生成密钥库将位置定位在jdk的bin文件中,输入以下命名行:keytool -genkey -alias ChangeBackgroundWidget.keystore -keyalg RSA - ...
- [Android]使用platform密钥来给apk文件签名的命令
1.使用platform密钥对apk进行签名 1.1.进入<Android_Source_Path>/build/target/product/security,找到[platform.p ...
- Android APK如何签名
Android项目以它的包名作为唯一标识,如果在同一设备上安装两个相同的应用,后面安装的应用就会覆盖前面安装的应用.为了避免这种情况的发生,我们需要对作为产品发布的应用进行签名. 签名其实有两个作用: ...
- android APK 文件的生成过程
步骤: 1. 用 aapt工具生成R文件aapt package -m -J gen目录 -M AndroidManifest.xml -S res目录 -I 编译版本sdk的android ...
- (转载)重新对APK文件签名
1.将证书(debug.keystore)复制到与需要重新签名的apk文件相同的目录下(如:复制到D:\Sign) 2.在cmd中切换到需要重新签名的apk文件的目录下 3.使用WinRAR打开要重新 ...
随机推荐
- 【面试虐菜】—— Oracle知识整理《收获,不止Oracle》
普通堆表不足之处: 表更新有日志开销 表删除有瑕疵 表记录太大检索较慢 索引回表读开销很大 有序插入难有序读出 DELETE产生的undo最多,redo也最 ...
- 【转】Spring websocket 使用
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html https://spr ...
- SYNONYMS
SQL> SELECT * FROM V$VERSION WHERE ROWNUM=1; BANNER --------------------------------------------- ...
- Yii2版本号新特性简单介绍
Yii2 Beta版本号在今年4月份公布.眼下正在改动问题和完好文档中. Yii2要求PHP版本号不低于5.4,主要有例如以下改进: 1)支持PHP框架间协作组制定的PSR-4标准,这简化了文件夹并提 ...
- UNIX下的环境变量--转载
所有环境变量名都是大写小写,系统会当作shell script自定义变量,而不会当作环境变量 [root@mac-home macg]# echo $path ...
- 2016iweb峰会参会总结
2016年8月27日去国家会议中心参加iweb峰会. 8点半开始签到入场,8点20分排队签到的人已经排到另一个门口,人超级多啊. 9点一如既往的由h5女神娜姐开场. 上午场 基本是各公司的大佬们介绍各 ...
- c# 枚举基础有[flags]和没有的的区别
枚举提供成组的常数值,它们有助于使成员成为强类型以及提高代码的可读性.在 C# 中,使用 enum 来声明枚举. 枚举分为简单枚举和标志枚举两种. 基本语法示例 enum Day { Sun, Mon ...
- Eclipse错误
1.java compiler level does not match the version of the installed java project facet 解决:http://blog. ...
- spring quartz的触发器CrontriggerBean配置
每一个quartz的CronTrigger表达式分为七个子表达式,每个子表达式之间用空号分割,分别是:秒 分 时 日 月 星期 年.其中年不是必须的,所以CronTrigger最少有六个子表达式. 每 ...
- ZooKeeper应用场景
一.数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新.例如全局的配置信息,服务式服务框架 ...