与apk签名有关的那些概念与命令
一、概念篇
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签名有关的那些概念与命令的更多相关文章
- 关于APK签名的一些东西
什么是APK 了解APK签名之前,首先要知道什么是apk文件:APK是AndroidPackage的缩写,即Android安装包(apk),APK文件其实就是zip格式的文件,只是后缀被改为了apk, ...
- APK签名原理
网上已有多篇分析签名的类似文章,但是都有一个共同的问题,就是概念混乱,混乱的一塌糊涂. 在了解APK签名原理之前,首先澄清几个概念: 消息摘要 -Message Digest 简称摘要,请看英文翻译, ...
- [转]通过apk签名使应用程序有系统权限
[转]通过apk签名使应用程序有系统权限 (2013-01-08 13:40:50) 转载▼ 标签: it 分类: Android 出处:http://blog.csdn.net/doom66151/ ...
- Android5.1.1 - APK签名校验分析和修改源码绕过签名校验
Android5.1.1 - APK签名校验分析和修改源码绕过签名校验 作者:寻禹@阿里聚安全 APK签名校验分析 找到PackageParser类,该类在文件“frameworks/base/cor ...
- eclipse将android项目生成apk并且给apk签名
转载:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作 ...
- Android APK 签名 (转发)
Cordova 3.5 为 Android APK 签名,生成可发布的 APK 程序文件 任侠 2014-06-07 00:04 移动开发 抢沙发 16,288 views 目录 [隐藏] ...
- 一次简单的绕过apk签名校验
朋友发来一个apk,需要分析其中的一些算法,分析过程涉及到了重新打包apk,打包后的apk运行失败,估计是apk内部有检验是否被篡改的代码.检验apk是否被篡改,简单的方法是直接校验签名,如果apk签 ...
- apk签名(不打包)
apk提交给应用市场加固后,需要重新签名 签名工具:360签名 下载地址:http://yunpan.cn/cm8GqVWL7Y8Eh 签名步骤:http://jiagu.360.cn/qcms/he ...
- 获取APK签名
获取apk签名工具类 import android.content.Context; import android.content.pm.PackageInfo; import android.con ...
随机推荐
- Android 软键盘的显示和隐藏,这样操作就对了
一.前言 如果有需要用到输入的地方,通常会有需要自动弹出或者收起软键盘的需求.开篇明义,本文会讲讲弹出和收起软键盘的一些细节,最终还会从源码进行分析. 想要操作软键盘,需要使用到 InputMetho ...
- NGUI_概述
序言:这是张三疯第一次开始NGUI插件的学习,刚开始学习,肯定有很多漏洞,后期会及时的补上的. 希望大家可以见谅,希望大佬多多指教. 一.什么是NGUI: NGUI是严格遵循KISS原则并用C#编写的 ...
- kubernetes入门实践
k8s中文文档 k8s概念比较多,有什么概念的疑惑的推荐看k8s中文文档. me的环境 操作系统:centos7 docker:1.12.6 环境跟me的不一致?不要慌,基本大部分操作都是行的通的. ...
- Git~GitLab当它是一个CI工具时
CI我们都知道,它是持续集成的意思,主要可以自动处理包括编译,测试,发布等一系列的过程,而GitLab也同样包含了这些功能,我们可以通过pipeline很容易的实现一个软件从编译,测试,发布的自动化过 ...
- NDK开发过程自认为好的一些参考资料
虽然NDK开发时间很短, 但也接触了一些自认为还不错的资料, 记录下来. 一.首先就说官方文档吧 网上资料好多过时了, 并且有点参差不齐. 所以看官方文档还是很有必要的,我根据我的需求整理了两个的链接 ...
- Intent启动系统组件(activity,service,BroadReceiver)-android学习之旅(四十九)
android提供了统一的编程模型Intent来启动系统的组件,这样提供了松耦合性.是一种mvc的编程模式 $(function () { $('pre.prettyprint code').each ...
- 学习日记之工厂方法模式和Effective C++
简单工厂模式VS工厂方法模式: 简单工厂模式:最大长处在于工厂类中必须包括必要的逻辑推断,依据client选择条件动态实例化相关类,对于client来说,去除了与详细产品的依赖. 工厂方法模式(Fac ...
- Qt音乐播放器制作(二)Easy Player
两天没有公布新的动态.主要原因还是个人的生活和工作时间限制,如今赶晚贴出第二版. 先放个图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuNV9y ...
- 两小时搞定C#版超级战舰游戏
课程简单介绍 游戏开发已然是眼下火星上都非常火的开发技术.而休闲的小游戏超级战舰也是眼下白领中最流行的小游戏.那超级战舰游戏是如何在两个小时高速搞定的呢?休闲类的小游戏高速开发的指南是什么?C#是如何 ...
- HDU 1013.Digital Roots【模拟或数论】【8月16】
Digital Roots Problem Description The digital root of a positive integer is found by summing the dig ...