文档章节

获取APK签名证书的SHA1和MD5

梁金堂
 梁金堂
发布于 2015/05/12 09:01
字数 676
阅读 313
收藏 0

代码说明一切,请直接阅读代码。

package com.mycompany.myapp5;

import android.app.*;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.*;
import android.widget.*;
import java.io.*;
import java.security.cert.CertificateFactory;
import java.util.*;
import java.security.cert.X509Certificate;
import android.content.pm.*;
import java.security.MessageDigest;
import java.security.cert.*;

public class MainActivity extends Activity 
{
	ByteArrayOutputStream bos=new ByteArrayOutputStream();
	OutputStreamWriter osw=new OutputStreamWriter(bos);
	PrintWriter pw=new PrintWriter(osw, true);

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
		ScrollView sv=new ScrollView(this);
		TextView tv=new TextView(this);

		sv.addView(tv);
		setContentView(sv);
		getCertMsg(this.getPackageName());
		pw.flush();
        tv.setText(bos.toString());
    }
	private void getCertMsg(String packageName)
	{
		PackageInfo pis;
		try
		{
			pis = this.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
			Signature[] sigs = pis.signatures; //签名
			pw.println("sigs.len:" + sigs.length);

			pw.println("sigs[0] data:");
			pw.println(toHex(sigs[0].toByteArray()));
			pw.println();

			CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
//获取证书
			X509Certificate cert = (X509Certificate) certFactory.generateCertificate(
				new ByteArrayInputStream(sigs[0].toByteArray()));
//获取证书发行者 可根据证书发行者来判断该应用是否被二次打包(被破解的应用重新打包后,签名与原包一定不同,据此可以判断出该应用是否被人做过改动)

			pw.println("cert data:");
			pw.println(toHex(cert.getEncoded()));
			pw.println();

			MessageDigest sha1=MessageDigest.getInstance("SHA1");
			byte[] bs=sha1.digest(cert.getEncoded());
			String certSha1=toHex(bs);

			MessageDigest md5=MessageDigest.getInstance("md5");
			byte[] bs2=md5.digest(cert.getEncoded());
			String certMd5=toHex(bs2);
			pw.println("sha1:");
			pw.println(certSha1);
			pw.println();
			pw.println("md5");
			pw.println(certMd5);
			pw.println();
			pw.println(cert.getIssuerDN().toString());
			pw.println(cert.getSubjectDN().toString());
		}
		catch (CertificateException e)
		{

			e.printStackTrace(pw);
		}
		catch (Exception e)
		{
			e.printStackTrace(pw);
		}

	}
	char[] cs=new char[16];
	{
		for (int i=0;i < 10;i++)
		{
			cs[i] = (char) ('0' + i);
		}
		for (int i=10;i < 16;i++)
		{
			cs[i] = (char) ('A' + i - 10);
		}
	}
	String toHex(byte[] bs)
	{
		char[] cs=new char[bs.length * 2];
		int x;
		for (int i=0;i < bs.length;i++)
		{
			x = bs[i] & 0xff;
			cs[2 * i] = this.cs[x / 16];
			cs[2 * i + 1] = this.cs[x % 16];
		}
		return new String(cs);
	}
}

上面的cert data=cert.getEncoded());

cert data就是pem文件的实际数据,也就是说,pem文件用的Base64编码,再转回byte[] 就是certdata了。

在上面的例子中,sigs[0].toByteArray()得到的数据和cert data是一样的,

再说说什么是pem文件,用过signApk工具的会在该工具的目录发现有两个文件,分别是.pem文件和.pk8文件

cert data等于.pem文件的内容的主体部分,也即是-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----
之间的部分,不包括这两个标记.BEGIN CERTIFICATE这个标记可能是其他相似的标记,openssl生产的就出现这种情况。

对cert data SHA1摘要就和.pem公钥证书的SHA1指纹一样了,同理md5也一样。

看到这里,有人会问,我要的是 keystore证书的指纹,你怎么跟我讨论这个?

先别急,keystore证书的指纹和pem公钥证书的指纹是一样的,可以使用openssl将keystore的证书转成.pem公钥证书和.pk8私钥。转化后证书的指纹信息是一样的。提供个如何转化证书的链接 http://blog.csdn.net/ilittleone/article/details/17914995

说到这里,你应该明白了吧。

© 著作权归作者所有

下一篇: android关闭日志
梁金堂
粉丝 9
博文 15
码字总数 17275
作品 0
玉林
私信 提问
Android Studio|Eclipse 中如何查看获取MD5和SHA1值(应用签名)

以前在Eclipse中我们获取MD5和SHA1很容易就找到了如下图所示: 就可以在Eclipse中看到所需要调试的MD5和SHA1。但是在AndroidStudio中我找了一圈也没有发现能查看调试的MD5和SHA1(请原谅我菜...

豆花饭烧土豆
2016/12/11
142
0
apk签名详细原理及jarsigner版本问题

1.首先了解你的keystore是啥。 别名: androiddebugkey 创建日期: 2013-11-30 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=Android Debug, O=Android, C=US 发布者: CN=An...

asay
2016/05/17
548
0
获取android应用签名证书(打包APK用到的那个文件)的SHA1,MD5,SHA256值

转载自:http://www.cnblogs.com/goldeneast/archive/2013/09/09/3309129.html http://developer.baidu.com/map/sdkandev-1.htm#.E7.AE.80.E4.BB.8B3(这个URL页面,最后面,百度地图也提供了......

巴顿
2015/02/10
6.7K
0
Android 获取apk签名的fingerprint

假定安装了JDK,如果想查HelloWorld.apk所使用的签名的fingerprint,可以这样做: 1. 查找apk里的rsa文件 (Windows) > jar tf HelloWorld.apk |findstr RSA (Linux) $ jar tf HelloWorl...

Zero__One
2014/04/29
2.2K
1
Android APK 签名比对

转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html Android APK 签名比对 发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的。签名机制在...

ViceCode
2014/02/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11

“不是任何一朵云都能撑住这个流量。中国有两朵云,一朵是阿里云,一朵叫其他云。”11月11日晚,阿里巴巴集团CTO张建锋表示,“阿里云不一样,10年前我们从第一行代码写起,构建了中国唯一自...

阿里云官方博客
12分钟前
3
0
Spark自定义外部数据源

背景:有时候我们需要定义一个外部数据源,然后用spark sql的方式来处理。这样的好处有2点: (1)定义了外部数据源后,用起来很简洁,软件架构清晰,通过sql方式直接使用。 (2)容易分层分...

守望者之父
15分钟前
3
0
电磁兼容不应空论 越实践越知深浅

在电子行业中,电子工程师极为熟悉的就是EMC电磁兼容性测试的各项规范。其实大多工程师所了解的电磁兼容性一般来说就是:设备或系统在其电磁环境中能正常工作,且不对该环境中任何事物构成不...

demyar
16分钟前
3
0
16、SpringMVC拦截器

拦截定义 定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。 public class HandlerInterceptor1 implements HandlerInterceptor{ public boolean preHandle(HttpServletR......

快乐的瓶子
16分钟前
3
0
顺时针打印矩阵

public class Code_06_PrintMatrixSpiralOrder {public static void spiralOrderPrint(int[][] matrix) {int tR = 0; //左上角的行int tC = 0; //左上角的列int dR = ma......

Garphy
18分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部