关闭

Android apk签名算法解析

标签: androidapk加密
287人阅读 评论(0) 收藏 举报
分类:

安卓 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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6114次
    • 积分:108
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条
    文章分类