MANIFEST.MF文件内容:

Manifest-Version: 1.0
Created-By: 1.0 (Android)Name: res/drawable-xhdpi/ic_launcher.png
SHA1-Digest: AfPh3OJoypH966MludSW6f1RHg4=Name: res/menu/main.xml
SHA1-Digest: wXc4zBe0Q2LPi4bMr25yy5JJQig=Name: AndroidManifest.xml
SHA1-Digest: k3QiLyii25nxkE9q59pXGWI2aTo=Name: res/drawable-mdpi/ic_launcher.png
SHA1-Digest: RRxOSvpmhVfCwiprVV/wZlaqQpw=Name: res/drawable-hdpi/ic_launcher.png
SHA1-Digest: Nq8q3HeTluE5JNCBpVvNy3BXtJI=Name: res/layout/activity_main.xml
SHA1-Digest: qVW+nHovqmEmKpssXKUBidrNDDA=Name: resources.arsc
SHA1-Digest: luJu2wwHeH7XAJwms2gIq/pco40=Name: lib/armeabi/libhello-jni.so
SHA1-Digest: uFb6Vfi3T/Rq0dvjgCqW7fKKrzM=Name: classes.dex
SHA1-Digest: zaipAFvc+AzMSc2nJJG9zIrrfqE=Name: res/drawable-xxhdpi/ic_launcher.png
SHA1-Digest: GVIfdEOBv4gEny2T1jDhGGsZOBo=

CERT.SF文件内容:

Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA1-Digest-Manifest: KYIkAR4PbCA4w3MLMr7ViERYEC0=Name: res/menu/main.xml
SHA1-Digest: 4zwSAYv23t3kqpzCDB/SFXeI+fE=Name: res/drawable-xhdpi/ic_launcher.png
SHA1-Digest: cIga++hy5wqjHl9IHSfbg8tqCug=Name: AndroidManifest.xml
SHA1-Digest: FZ/sx6NI+BZkCi/hVlBHDLFbKxM=Name: res/drawable-mdpi/ic_launcher.png
SHA1-Digest: VY7kOF8E3rn8EUTvQC/DcBEN6kQ=Name: res/drawable-hdpi/ic_launcher.png
SHA1-Digest: stS7pUucSY0GgAVoESyO3Y7SanU=Name: res/layout/activity_main.xml
SHA1-Digest: bl4WBWN5ooqlzio7tNRqDWt3oWM=Name: resources.arsc
SHA1-Digest: tnBvelvdDz0kEBfPf+RjqGfpdn4=Name: classes.dex
SHA1-Digest: lxB86ol+PFq8rG2IpToRpZi2JcI=Name: lib/armeabi/libhello-jni.so
SHA1-Digest: +rWr7fBTZjm2JnvJytCJCdmdLso=Name: res/drawable-xxhdpi/ic_launcher.png
SHA1-Digest: KKqaLh/DVvFp+v1KoaDw7xETvrI=

比较发现CERT.SF比MANIFEST.MF多了一个SHA1-Digest-Manifest的值,这个值其实是MANIFEST.MF文件的SHA1并base64编码的值,可以手动验证,也可以从android源码分析。

打开android源码build/tools/signapk/SignApk.java分析,没有下载android源码的可以在线参考: https://github.com/OESF/Embedded-Master-MIPS/blob/370863733b500b7f0ded111f4b800bce990d69a5/build/tools/signapk/SignApk.java

// CERT.SFSignature signature = Signature.getInstance("SHA1withRSA");signature.initSign(privateKey);je = new JarEntry(CERT_SF_NAME);je.setTime(timestamp);outputJar.putNextEntry(je);writeSignatureFile(manifest,                    new SignatureOutputStream(outputJar, signature));
    /** Write a .SF file with a digest the specified manifest. */private static void writeSignatureFile(Manifest manifest, OutputStream out)            throws IOException, GeneralSecurityException {Manifest sf = new Manifest();Attributes main = sf.getMainAttributes();main.putValue("Signature-Version", "1.0");main.putValue("Created-By", "1.0 (Android SignApk)");BASE64Encoder base64 = new BASE64Encoder();MessageDigest md = MessageDigest.getInstance("SHA1");PrintStream print = new PrintStream(                new DigestOutputStream(new ByteArrayOutputStream(), md),                true, "UTF-8");        // Digest of the entire manifest        manifest.write(print);print.flush();main.putValue("SHA1-Digest-Manifest", base64.encode(md.digest()));Map<String, Attributes> entries = manifest.getEntries();        for (Map.Entry<String, Attributes> entry : entries.entrySet()) {            // Digest of the manifest stanza for this entry.print.print("Name: " + entry.getKey() + "\r\n");            for (Map.Entry<Object, Object> att : entry.getValue().entrySet()) {print.print(att.getKey() + ": " + att.getValue() + "\r\n");}print.print("\r\n");print.flush();Attributes sfAttr = new Attributes();sfAttr.putValue("SHA1-Digest", base64.encode(md.digest()));sf.getEntries().put(entry.getKey(), sfAttr);}sf.write(out);}

通过代码可以发现SHA1-Digest-Manifest是MANIFEST.MF文件的SHA1并base64编码的结果。

后面的for循环是对每一项再次SHA1并base64编码,例如:

Name: res/menu/main.xml
SHA1-Digest: wXc4zBe0Q2LPi4bMr25yy5JJQig=

注意最后是两个"\r\n",手动验证也很简单,把上面的字符串保存为文件,并查看文件的HASH值是:E33C12018BF6DEDDE4AA9CC20C1FD2157788F9F1,将其保存为二进制文件并对文件进行一次base64编码,可得4zwSAYv23t3kqpzCDB/SFXeI+fE=

参考:
取得签名工具加载证书库, 取得签名证书链和私钥:

http://www.oschina.net/code/snippet_1434_1503

从CERT.RSA中提取证书 :

http://www.wangchen.org/2011/01/%E4%BB%8Ecert-rsa%E4%B8%AD%E6%8F%90%E5%8F%96%E8%AF%81%E4%B9%A6/

转载于:https://my.oschina.net/u/221552/blog/285775

android APK签名过程之CERT.SF分析相关推荐

  1. Android APK 签名比对

    Android APK 签名比对 转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html Android APK  ...

  2. Android APK签名原理

    Android APK 签名原理涉及到密码学的加密算法.数字签名.数字证书等基础知识,这里做个总结记录. 非对称加密 需要两个密钥,一个是公开密钥,另一个是私有密钥:一个用作加密的时候,另一个则用作解 ...

  3. Android APK签名 JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore E:\xxxxxx- pkcs12“ 迁移到行业标准格式

    Android Studio中进行签名 转载地址:Android APK签名 JKS 密钥库使用专用格式.建议使用 "keytool -importkeystore -srckeystore ...

  4. Android apk签名获取方法

    Android apk签名获取的一种方法,供大家参考 Windows(黑窗口)或Mac(终端)获取apk的签名: 1,先获取.jks文件路径(复制好备用) 2,在黑窗口或终端中输入 keytool - ...

  5. MD5、SHA1和android apk签名杂谈

     这一段是原创,说得不对的地方还请支出(:        首先要分清楚MD(Message Digest 信息摘要)5(第五代)和SHA1(Secure  Hash  Algorithm 安全哈希算法 ...

  6. android apk签名工具_Android 应用修改为系统签名的方法(macOS)

    在做 Android 工控机应用开发时,经常会涉及到一些要系统签名才能做的功能,比如应用静默更新,关机重启等功能. 本文介绍系统签名的具体操作方法. 需要准备的东西,相关的签名文件.签名工具.要签名的 ...

  7. android软件更新模块实现的技术和方法,Android APK签名原理及方法

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

  8. Android APK签名总结-- V1签名和V2签名使用和区别

    1. 工具介绍 jarsigner 是JDK提供的针对jar包签名的通用工具, 位于 JDK/bin/jarsignerapksigner 是Google官方提供的针对Android apk 签名验证 ...

  9. Android APK签名原理及方法

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

最新文章

  1. Sap Byd Soap使用 SSL 客户端证书
  2. Ubuntu terminal路径太深,名字太长
  3. 如何制作chm格式的帮助文件
  4. 迪普工业以太网交换机产品线
  5. mysql五种日期函数
  6. Linux服务器的架设 (DHCP,NIS,SAMBA,FTP,DNS)
  7. opencl 加速 c语言程序_Win10应用获得面向OpenCL和OpenGL的兼容层
  8. linux系统最大打开文件数(/etc/security/limits.conf:待更新其他设置)
  9. elasticsarch6.5.4安装插件 searchguard和elasticsearh-head插件安全性问题
  10. keras 微调整模型_如何围绕微服务调整团队
  11. SAP License:ERP失败案例集
  12. 斐波那契数的两种实现方式———1.递归实现,2迭代实现
  13. repo 的几个使用理解
  14. springfox-swagger-ui 3.0.0 配置,springfox-boot-starter 配置
  15. python爬虫-网易云音乐的歌曲热评
  16. oracle 并行查询
  17. 地理探测器的应用方法
  18. 2013中秋大同三日游
  19. zoomlt 安装/使用
  20. 采用IMXRT1020驱动ATWINC1500模块

热门文章

  1. 《心流》| 文化塑造秩序
  2. 乡村旅游电子商务平台系统解决方案
  3. 浙江工业大学计算机科学与技术研究生院,浙江工业大学计算机科学与技术研究生专业排名...
  4. Android app集成微信支付
  5. AD623单电源供电差分放大的电路设计与仿真
  6. 生产实习-图像处理基础
  7. JavaScript CommonJS 模块
  8. QNX Neutrino 进程间通信编程之Message-passing/Pulse
  9. 北京共识区块链技术发展研究院正式揭牌成立
  10. 微信管理工具应该具备什么功能