拿某apk举例
用7z解压*.apk,可以看到如下目录
这里有三个重要的文件MANIFEST.MF、CERT.SF、CERT.RSA,它们的用途是对apk进行签名,我们今天就来分析三者之间的关系
MANIFEST.MF文件内容是
Manifest-Version: 1.0 Created-By: 1.0 (Android SignApk) Name: meta-INF/services/javax.ws.rs.ext.MessageBodyWriter SHA-256-Digest: ****AaoOiGNRVH9r6iGb5fv0s2ODOAIT6dwnkv***fI= Name: * SHA-256-Digest: * ......
SHA-256-Digest的值是直接对该文件做sha256计算的结果。
2. CERT.SFCERT.SF文件的内容是:
Signature-Version: 1.0 X-Android-APK-Signed: 2 SHA-256-Digest-Manifest: ****Ei3aTaMbAXMg7Rr304ocINfE6wy90Mlsxu***2Q= Created-By: 1.0 (Android SignApk) Name: meta-INF/services/javax.ws.rs.ext.MessageBodyWriter SHA-256-Digest: ****dbjojNgoyNv+KK8wLZARBNtHmq8y4XVtRQ***yk= Name: * SHA-256-Digest: * ......
CERT.SF文件的内容由来:
SHA-256-Digest:后面的内容是MANIFEST.MF对应行的连接前后共三行做摘要而来。
可以使用如下python代码
用Python做哈希之HMAC_SHA*_base64_晓翔仔的博客-CSDN博客在很多场景下,需要生成难以猜测的字符串,会采用选取一个key,将原code用hmac sha1制作成一个160比特的哈希并base64编码的形式。这里便是一个python代码。pytho版本3.9。推荐使用VSCODE调试python,可以一间安装pythonpython代码:import hmacimport base64from hashlib import sha1def hash_hmac_sha1_base64(key, code, sha1): hma.https://blog.csdn.net/qq_33163046/article/details/120985360
令test_str取值
test_str = 'Name: meta-INF/services/javax.ws.rs.ext.MessageBodyWriterrnSHA-256-Digest: ****AaoOiGNRVH9r6iGb5fv0s2ODOAIT6dwnkv***fI=rnrn'
设置method
hash_method = "hash256_base64"
可以计算出结果。
hash256 base64 is ****dbjojNgoyNv+KK8wLZARBNtHmq8y4XVtRQ***yk=3. CERT.RSA
CERT.RSA文件包括两个部分“certificat + signature”
3.1 certificate:
ERT.RSA更改后缀为.p7b,就可以打开查看公钥了。选择detail,点击copytofile后选择第二项“base64 encoded”,可以导出XX.cer的证书文件。
openssl x509 -in XX.cer -pubkey -noout > XX.pem 可以产生公钥的16进制字符串
可以用以下命令看到证书里公钥
ubuntu@ip-172-*-*-20:~/work$ openssl x509 -in pubkey.cer -pubkey -noout > pubkey.pem ubuntu@ip-172-*-*-20:~/work$ cat pubkey.pem -----BEGIN PUBLIC KEY----- MIIB********************************************* -----END PUBLIC KEY-----3.2 signature:
经过二进制文件比对,同一个目录下两个apk证书相同,最后256bytes不同,很显然这是 RSA(2048)私钥加密后的签名,加密的什么呢?加密的是CERT.SF文件。



