一、概念篇

1、消息摘要-Message Digest

消息摘要:在消息数据上,执行一个单向的hash函数,生成一个固定长度的hash值,这个Hash值就是消息摘要,也成为数字指纹。

消息摘要特点:

(1)无论输入消息多长,计算出来的消息摘要长度总是固定的;

(2)不可逆性,通过摘要无法推算出消息本身;

(3)如果修改了消息,摘要会发生变化(长明文生成短摘要的Hash必然会碰撞);

作用:只能保证消息的完整性,无法保证消息的防篡改。使用场景:文件下载的MD5校验。

消息摘要算法:MD5、SHA-0、SHA-1

2、数字签名-Signature

数字签名:消息发送者用自己的私钥对消息摘要加密产生的一个字符串,加密算法确保别人无法伪造生成这段字符串。这段数字字符串也是对消息发送者发生消息真实性的一个有效证明,故称数字签名。

数字签名是非对称机密算法+数字摘要技术的结合。

作用:保证消息完整性、也可以防篡改。

数字签名原理:消息发送者将信息摘要用私钥加密,与原文一起传送给接收者。消息接收者用公钥才能将信息摘要解密,再使用相同的Hash函数对收到原文计算产生一个信息摘要,对比二者是否一致。基于非对称加密算法的数字签名保证防篡改,消息摘要保证完整性。

思考:为什么只对消息摘要进行数字签名?

加密算法普遍存在计算耗时较长的瓶颈,MD5、SHA等消息摘要算法则不存在该问题,只针对消息摘要进行签名,可以大大减少加密内容,提升整个数字签名过程的效率。

3、数字证书-Certificate

数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公钥的文件。

数字证书包含内容:

证书发布机构 Issuer

证书有效期Validity

消息发送方的公钥

证书所有者 Subject

数字签名使用的算法

备注:Android APK中的CERT.RSA是自签名的,并不需要第三方权威机构发布或者认证,用户可以在本地机器生成这个自签名证书。

二、Android APK两种签名方式

1、jarsign和apksign工具

jarsign —— 是Java本身自带的一个工具,可以对jar进行签名。

signapk —— 是专门为Android应用程序apk进行签名的工具。

二者的签名算法没有什么区别,主要是签名时使用的文件不一致。

2、keystore和pk8、x509.pem的区别

jarsian 工具签名时使用的是keystore文件。Eclipse的Debug包默认使用jarsign工具签名。

apksign 工具签名时使用的pk8、x509.pem文件

3、Android中是允许使用多个keystore对apk进行签名的。

jarsign签名文件:文件后缀名是签名算法,文件名是keystone别名。

apksign签名之后的apk中的META-INF写死了是CERT的名字。

4、apksign签名

eg: apksign publickey.x509.pem privatekey.pk8 input.apk output.apk

publickey.x509.pem ——包含证书和证书链,包含了公钥和加密算法;

privatekey.pk8 —— 私钥

apk中签名文件:

MANIFEST.MF —— 包含了input.jar所有文件内容的摘要值

CERT.SF —— 保存MANIFEST.MF 的摘要值以及MANIFEST.MF中每一个摘要项的SHA1并base64后记录。

CERT.RSA —— 保存了签名和公钥证书。签名用到的摘要信息就是CERT.SF内容。

最终保存在CERT.RSA中的是CERT.SF的数字签名,签名使用privateKey生成,签名算法会在publicKey中定义,同时会把publicKey保存在CERT.RSA中,即CERT.RSA包含了签名和签名用到的证书,且证书要求是自签名的。

5、系统默认debug.keystore

(1)默认debug.keystore信息如下:

Keystore name: “debug.keystore”

Keystore password: “android”

Key alias: “androiddebugkey”

Key password: “android”

CN: “CN=Android Debug,O=Android,C=US”

(2)使用自带debug.keystore重新签名APK文件。

jarsigner  -digestalg SHA1 -sigalg MD5withRSA -keystore debug.keystore -storepass android -keypass android xxx.apk androiddebugkey

JDK 1.7,需要加上:-digestalg SHA1 -sigalg MD5withRSA

6、查看签名信息

查看keystore信息:keytool -list -keystore xxx.keystore -alias xxx -v

查看keystore公钥证书信息: keytool -list -keystore xxx.keystore -alias xxx -rfc

查看apk签名信息:jarsigner -verify -verbose -certs xxx.apk

与apk签名有关的那些概念与命令的更多相关文章

  1. 关于APK签名的一些东西

    什么是APK 了解APK签名之前,首先要知道什么是apk文件:APK是AndroidPackage的缩写,即Android安装包(apk),APK文件其实就是zip格式的文件,只是后缀被改为了apk, ...

  2. APK签名原理

    网上已有多篇分析签名的类似文章,但是都有一个共同的问题,就是概念混乱,混乱的一塌糊涂. 在了解APK签名原理之前,首先澄清几个概念: 消息摘要 -Message Digest 简称摘要,请看英文翻译, ...

  3. [转]通过apk签名使应用程序有系统权限

    [转]通过apk签名使应用程序有系统权限 (2013-01-08 13:40:50) 转载▼ 标签: it 分类: Android 出处:http://blog.csdn.net/doom66151/ ...

  4. Android5.1.1 - APK签名校验分析和修改源码绕过签名校验

    Android5.1.1 - APK签名校验分析和修改源码绕过签名校验 作者:寻禹@阿里聚安全 APK签名校验分析 找到PackageParser类,该类在文件“frameworks/base/cor ...

  5. eclipse将android项目生成apk并且给apk签名

    转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...

  6. Android APK 签名 (转发)

    Cordova 3.5 为 Android APK 签名,生成可发布的 APK 程序文件  任侠  2014-06-07 00:04  移动开发  抢沙发  16,288 views  目录 [隐藏] ...

  7. 一次简单的绕过apk签名校验

    朋友发来一个apk,需要分析其中的一些算法,分析过程涉及到了重新打包apk,打包后的apk运行失败,估计是apk内部有检验是否被篡改的代码.检验apk是否被篡改,简单的方法是直接校验签名,如果apk签 ...

  8. apk签名(不打包)

    apk提交给应用市场加固后,需要重新签名 签名工具:360签名 下载地址:http://yunpan.cn/cm8GqVWL7Y8Eh 签名步骤:http://jiagu.360.cn/qcms/he ...

  9. 获取APK签名

    获取apk签名工具类 import android.content.Context; import android.content.pm.PackageInfo; import android.con ...

随机推荐

  1. DIV居中的经典方法

    1. 实现DIV水平居中 设置DIV的宽高,使用margin设置边距0 auto,CSS自动算出左右边距,使得DIV居中. 1 div{ 2 width: 100px; 3 height: 100px ...

  2. JAVA提高十九:WeakHashMap&EnumMap&LinkedHashMap&LinkedHashSet深入分析

    因为最近工作太忙了,连续的晚上支撑和上班,因此没有精力来写下这篇博客,今天上午正好有一点空,因此来复习一下不太常用的集合体系大家族中的几个类:WeakHashMap&EnumMap&L ...

  3. python通过webservice接口实现配置下发

    项目上要开发一个小工具,通过webservice接口实现配置下发,考虑到python的第三方库对soap的良好支持,果断决定用python来完成这一使命. Python的支持webservice的第三 ...

  4. .9-浅析webpack源码之NodeEnvironmentPlugin模块总览

    介绍Compiler的构造比较无趣,不如先过后面的,在用到compiler的时候再做讲解. 这一节主要讲这行代码: // 不管这里 compiler = new Compiler(); compile ...

  5. 利用KindEditor实现公司通讯录的维护

    引言: 本人所属施工单位,在建项目较多,通讯录是以项目为单位挂接在公司内部网站通讯录板块,以静态页面展示.一直以来都是项目部办公室通过电话.邮件等方式通知总部信息部门变更通讯录,日常维护的工作量较大. ...

  6. 大数据学习(1)Hadoop安装

    集群架构 Hadoop的安装其实就是HDFS和YARN集群的配置,从下面的架构图可以看出,HDFS的每一个DataNode都需要配置NameNode的位置.同理YARN中的每一个NodeManager ...

  7. 求前n个素数(C++)

    输入一个输n,输出前n个素数. #include<iostream> #include <math.h> using namespace std; class Sushu { ...

  8. Docker + Jenkins 持续部署 ASP.NET Core 项目

    Docker 是个好东西,特别是用它来部署 ASP.NET Core Web 项目的时候,但是仅仅的让程序运行起来远远不能满足我的需求,如果能够像 DaoCloud 提供的持续集成服务那样,检测 gi ...

  9. Nginx服务编译安装、日志功能、状态模块及访问认证模式实操

    系统环境 [root@web ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@web ~]# uname -a Linux d ...

  10. spring MVC上传附件

    spring mvc为我们封装了十分简单的上传附件的方法,以下通过一个例子学习. 1.jsp <%@ page language="java" contentType=&qu ...