Android apk签名算法解析

安卓 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() 值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值