Android apk签名算法解析

转载 2015年11月18日 15:45:29

安卓 Apk签名是 Sun Jar 签名的一种特例。在安卓 Apk 签名时,除了META‐INF,其他每个文件都要先算 SHA1 Digest 放在META‐INF/Manifest.MF,然后用私钥加密 Manifest.MF 产出META‐INF/CERT.SF,证书等写入 META‐INF/CERT.RSA。具体可以参考安卓签名和分析。 从普通证书追朔到根证书,形成一个证书链。不过在安卓开发过程中通常采用自签名证书,这时证书链里 只有一个证书。 本文涉及的都是 X509Certificate,而且加密算法是 RSA


Android JavaSignature 

在 Android Java里,通过以下方法获得的 signatures 就是证书链。

PackageInfopackageInfo = getPackageManager().getPackageInfo(packageName,PackageManager.GET_SIGNATURES);
Signature[]signatures = packageInfo.signatures;

Signature的Signature(byte[]) 和 toByteArray() 是对称的, equals() 就是 bytearray 的逐字节比较; Signature(String) 和 toCharsArray() 是对称的,用的是十六进制字符串。

 

Sun Java Certificate

在 Sun Java里,通过以下方法获得的 certs 就是证书链。 X509Certificate

InputStream is =jarFile.getInputStream(je);
while (is.read(readBuffer, 0,readBuffer.length) != -1) {
}
is.close();
Certificate[] cert =je.getCertificates();

需要注意的是,META‐INF 和目录都需要忽略,其他所有 je 的 certs 都应该是相同的。

 

Android Signature 和Sun Java Certificate 的互相转换

// X509Certificateto Signature 
Signature sig = new Signature(cert.getEncoded());
// Signature toX509Ceritificate
<pre name="code" class="java">byte[] bytes = sig.toByteArray();
CertificateFactorycertificateFactory = CertificateFactory.getInstance("X.509");
InputStream in = newByteArrayInputStream(bytes);
X509Certificate cert= (X509Certificate)certificateFactory.generateCertificate(in);



钥与证书

Signature是没有公钥接口的,需先转换成 Certificate ,再调用 getPublicKey(),返回值的实现类 是RSAPublicKeyImpl 。 需要注意的是,PublicKey 和 Certificate 是不同的东西,Certificate 里包含了 PublicKey 。 RSAPublicKeyImpl 父类 X509Key 实现的getEncoded() 和 RSAPublicKeyImpl(byte[]) 是对称的,但是toString() 没有与之对称的构造函数,而且采用 10 进制字符串来输出 modulus 和 exponent 。X509Key 的 equals() 用的是 getEncoded() 值。


android 应用内部获取本应用或者对应包名的应用的SHA1签名的办法

public static String getCertificateSHA1Fingerprint(Context context) { PackageManager pm = context....
  • gaoshouxiaodi
  • gaoshouxiaodi
  • 2014-07-15 18:16:29
  • 5619

PackageInfo方式获取App签名信息(含MD5)

概述: Android对每一个Apk文件都会进行签名,在Apk文件安装时,系统会对其签名信息进行比对,判断程序的完整性,从而决定该Apk文件是否可以安装,在一定程度上达到安全的目的。 如何获取Ap...
  • BlogRecord
  • BlogRecord
  • 2015-09-14 21:34:42
  • 4124

android_apk安全之运行时签名校验

android_apk安全之运行时签名校验有时候我们为了防止自己的应用被反编译后重新打包,不得不采取运行时进行签名校验的方式。因为会经常用到,所以在这里整理了一下校验方式。代码当中的注释很详细,故不再...
  • u012233285
  • u012233285
  • 2017-03-14 15:40:18
  • 1078

通过androidStudio给apk签名

第一步、点击Build>generate Signed APK进入操作界面 第二步、点击 Create NewKeyStore 创建一个新的 keyStore。 第三步、...
  • bruceyangjie
  • bruceyangjie
  • 2015-12-25 12:11:35
  • 415

Android apk签名

  • 2015年01月08日 17:41
  • 1KB
  • 下载

Android App运行时签名校验

有时候我们为了防止自己的应用被反编译后重新打包,不得不采取运行时进行签名校验的方式。 因为会经常用到,所以在这里整理了一下校验方式。 /** * Create By HaoRui ...
  • u014341567
  • u014341567
  • 2017-03-19 14:06:50
  • 3444

apk签名验证实现

前言 在学习的路途中,留下一点痕迹。签名保护的方法很多,我简单实现一下。 使用全局Context private static Context context; @Overrid...
  • qq_33438733
  • qq_33438733
  • 2018-02-28 00:07:45
  • 23

Android APK签名原理及方法

一 Android签名机制及原理 Android系统在安装APK的时候,首先会检验APK的签名,如果发现签名文件不存在或者校验签名失败,则会拒绝安装,所以应用程序在发布之前一定要进行签名。给AP...
  • YCL_666
  • YCL_666
  • 2016-06-14 09:00:15
  • 1269

Android Studio apk打包以及获取apk签名信息

首先说下Android Studio 主要分为以下几步 填写你的签名的一些信息 (例如签名的文件名、省份、密码 别名 就是你比如叫钟仕垣 但是别名是狗蛋 认证年限就是apk过期默认是25年 其他就是组...
  • qq_15950325
  • qq_15950325
  • 2017-07-26 18:09:52
  • 672

Android-NDK-之so文件签名校验

前面说了so文件可以大大减少数据被泄露的情况,但这得是有前提条件。 因为正常的so文件,别人是可以拿到后可以直接在项目中使用的。 那有什么方式可以增加难度,让别人需要一定复杂操作才能使用该so文件...
  • jiankeufo
  • jiankeufo
  • 2017-11-08 09:19:20
  • 865
收藏助手
不良信息举报
您举报文章:Android apk签名算法解析
举报原因:
原因补充:

(最多只允许输入30个字)