Android基础『V1V2V3签名』
基础概念
签名:在 APK 中写入一个「指纹」。指纹写入以后,APK 中有任何修改,都会导致这个指纹无效,Android 系统在安装 APK 进行签名校验时就会不通过,从而保证了安全性。
摘要算法: 使用一段简单的看上去随机的不可逆向的固定长度的字符串来表示一个文件的唯一性。 常见的摘要算法如MD5(128个比特位)、SHA-1算法(160/192/256个比特位)。
公钥密码体制:也称非对称算法,特点是 公钥是公开的 ,私钥是保密的。常见的如:RSA。
展开讨论一下RSA:
Android中的签名方案
V1 :基于jarsigner(JDK自带工具,使用keystore文件进行签名) 或 apksigner(Android专门提供的,使用pk8、x509.pem进行签名)。keystore和pk8/x509.pem可以相互转换。
签名原理:首先keystore文件包含一个MD5和一个SHA1摘要。 这也是很多开放平台需要我们上传的摘要数据 。
签名APK后会在META-INF文件夹下生产CERT.RSA、CERT.SF、MANIFEST.MF三个文件。
在apk中,/META-INF文件夹中保存着apk的签名信息,一般至少包含三个文件,[CERT].RSA,[CERT].SF和MANIFEIST.MF文件。这三个文件就是对apk的签名信息。
MANIFEST.MF中包含对apk中除了/META-INF文件夹外所有文件的签名值,签名方法是先SHA1()(或其他hash方法)在base64()。存储形式是:Name加[SHA1]-Digest。
[CERT].SF是对MANIFEST.MF文件整体签名以及其中各个条目的签名。一般地,如果是使用工具签名,还多包括一项。就是对MANIFEST.MF头部信息的签名,关于这一点前面源码分析中已经提到。
[CERT].RSA包含用私钥对[CERT].SF的签名以及包含公钥信息的数字证书。
是否存在签名伪造可能:
修改(含增删改)了apk中的文件,则:校验时计算出的文件的摘要值与MANIFEST.MF文件中的条目不匹配,失败。
修改apk中的文件+MANIFEST.MF,则:MANIFEST.MF修改过的条目的摘要与[CERT].SF对应的条目不匹配,失败。
修改apk中的文件+MANIFEST.MF+[CERT].SF,则:计算出的[CERT].SF签名与[CERT].RSA中记录的签名值不匹配,失败。
修改apk中的文件+MANIFEST.MF+[CERT].SF+[CERT].RSA,则:由于证书不可伪造,[CERT].RSA无法伪造。
V2 :7.0新增的
签名后的包会被分为四部分
1. Contents of ZIP entries(from offset 0 until the start of APK Signing Block)
2. APK Signing Block
3. ZIP Central Directory
4. ZIP End of Central Directory
新应用签名方案的签名信息会被保存在区块2(APK Signing Block) 中, 而区块1( Contents of ZIP entries )、区块3( ZIP Central Directory )、区块4( ZIP End of Central Directory )是受保护的, 在签名后任何对区块1、3、4的修改都逃不过新的应用签名方案的检查 。
V3 :9.0新增的
格式大体和 v2 类似,在 v2 插入的签名块(Apk Signature Block v2)中,又添加了一个新快(Attr块) 。
在这个新块中,会记录我们之前的签名信息以及新的签名信息,以 密钥转轮的方案,来做签名的替换和升级。这意味着,只要旧签名证书在手,我们就可以通过它在新的 APK 文件中,更改签名 。
v3 签名新增的新块(attr)存储了所有的签名信息,由更小的 Level 块,以 链表 的形式存储。
其中每个节点都包含用于为之前版本的应用签名的签名证书,最旧的签名证书对应根节点,系统会让每个节点中的证书为列表中下一个证书签名,从而为每个新密钥提供证据来证明它应该像旧密钥一样可信。
这个过程有点类似 CA 证书的证明过程,已安装的 App 的旧签名,确保覆盖安装的 APK 的新签名正确,将信任传递下去。
注意: 签名方式只支持升级不支持降级,如安装了V2的包,不能覆盖替换为V1的包。
参考
Android App签名(证书)校验过程源码分析
新一代开源Android渠道包生成工具Walle
Android 签名机制 v1、v2、v3
开发Android需要具备哪些基础技能
①Java基础知识 ②Linux基础知识 ③数据库基础知识 ④网络协议 ⑤Android基础知识 ⑥服务器端开发知识①Java基础知识很多朋友一上手就开始学习Android,似乎太着急了一些。Android应用程序开发是以Java语言为基础的,所以没有扎实的Java基础知识,只是机械的照抄别人的代码,是没有任何意义的。万丈高楼平地而起...
做Android开发 需要掌握哪些知识
3.数据库基础知识,这部分知识点相对来讲比较简单,简单的说就是增删改查数据库的操作。4.网络协议,http协议和socket协议这两种基础的协议是需要掌握的。5.android基础知识 6.服务器端的开发知识,很多android应用程序都需要服务器端的支持,所以掌握一些服务器的开发知识是很有必要的…… JAVA EE、PHP...
零基础学习android,android学习什么
首先学习java,java如果搞定,android学起来会比较轻松。android基础(Android开发环境调试,Android应用结构,界面组件与界面编程,四大组件)android中级(文件IO与SQLite,图形、图像与动画、音频、视频的录制于播放,传感器编程,GPS应用)android高级(网络编程与Web Service,OpenGL-ES 3D开发,整合Google服务,...
安卓开发需要学什么
安卓开发需要学:一、应用程序 Android以Java为编程语言,使接口到功能,都有层出不穷的变化,其中Activity等同于J2ME的MIDlet,一个 Activity 类负责创建视窗,一个活动中的Activity就是在 foreground(前景)模式,背景运行的程序叫做Service。二、中介软件 操作系统与应用程序的沟通桥梁,并用分为两层:...
安卓Android软件开发用什么语言?
Android 同时包含了Webkit,所谓的Webkit 就是Apple Safari浏览器背后的引擎。Surface flinger 是就2D或3D的内容显示到屏幕上。Android使用工具链(Toolchain)为Google自制的Bionic Libc。Android采用OpenCORE作为基础多媒体框架。OpenCORE可分7大块:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF...
Android开发的学习路线大概是怎样的?
因为安卓开发语言是使用java,因此必须了解,熟悉j2se。java基础看马士兵的视频就行,他讲的特别好,尤其是堆栈内存那一块。然后学疯狂java讲义,不需要都学,学前十章就行,不建议初学者学java编程思想,比较难懂,不适合入门。(时间2-3个月)第二步:书籍 入手的第一本书就是android疯狂讲义,七八...
Android基础之Activity生命周期
Activity是Android最常用的四大组件之一,Activity是Android应用中与用户交互的界面,通常一个activity就是一个屏幕,Activity一共有四种状态,Active\/Running(当Activity可见且可以与用户交互);Paused(当Activity可见但是不可交互);Stoped(当Activity被完全覆盖不可见);Killed(当Activity...
安卓开发需要学习哪些知识?
Java基本语法、面向对象相关的基本概念与思想,常用String类的api,异常处理,IO基础,容器,多线程,内存管理与垃圾回收,知道并最好知道几种常见的Java设计模式等,建议可以找些网上Java面试宝典之类的文章,熟悉下面试常遇到的一些Java知识点,一般都是Java基础。2、Android基础 Java如果算基础中的基础,那...
零基础,怎么学习Android安卓APP的开发,需要学习哪些知识
Android Studio开发环境,从UI入门,四大组件、系统服务、Fragment、Loaders、SQLite数据库、文件操作、网络通讯、多媒体、动画、布局优化、缓存优化、内存管理、编码技巧等介绍Android应用开发的全过程,最适合初学者的Android基础教程 企业级应用开发中常用或开源的第三方组件、框架,包括:百度地图、Bmob云平台...
Android 网络基础之网络协议篇
Android 网络基础之网络协议篇 我来答 1个回答 #热议# 你知道哪些00后职场硬刚事件?新科技17 2022-06-22 · TA获得超过140个赞 知道小有建树答主 回答量:115 采纳率:75% 帮助的人:82.7万 我也去答题访问个人页 关注 展开全部 学习一门技术或者看一篇文章最好的方式就是带着问题去学习,...
敛旭甲硝: 两种方式,一种开发工具eclipse,还有就是用apktool工具.I、只要Run As Android Application 过,到工作目录的bin文件夹下就能找到与项目同名的apk文件.II、 A.选中项目,右键=》Andoid Tools=》Export Unsigned Application Package,...
乌当区15837605245: 如何对Android的APP进行签名 - ?
敛旭甲硝: 1.签名的步骤a.创建keyb.使用步骤a中产生的key对apk签名2.具体操作方法一: 命令行下对apk签名(原理)创建key,需要用到keytool.exe (位于jdk1.6.0_24\jre\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于jdk1.6.0_...
乌当区15837605245: Android如何签名? - ?
敛旭甲硝: signapk.jar与eclipse export插件默认赋予程序一个DEBUG权限的签名 signapk.jar包含有系统权限(system api, permission),而eclipse export插件默认赋予程序一个DEBUG权限的签名.D:\work_feixun\GalleryBack>java -jar signapk.jar platform....
乌当区15837605245: 如何生成Android的签名证书 - ?
敛旭甲硝: cmd命令生成android签名证书,有空在写一篇eclipse导出带签名的apk,这里面包括生成新的签名.现在还是讲讲在cmd怎么操作生成签名证书.1、dos下进入JDK的bin目录 运行如下命令:keytool -genkey -alias android.keystore -keyalg RSA ...
乌当区15837605245: android签名有哪些作用? - ?
敛旭甲硝: 1、应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名.这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序.如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,...
乌当区15837605245: 如何判断 Android 应用的 Apk 签名是否一致 - ?
敛旭甲硝: 在程序中获取APK的签名时,通过signature方法进行获取,如下:packageInfo = manager.getPackageInfo(pkgname,PackageManager.GET_SIGNATURES); signatures = packageInfo.signatures; for (Signature signature : signatures) { builder.append(signature.toCharsString()); } signature = builder.toString(); 所以一般的程序就是在代码中通过判断signature的值,来判断APK是否被重新打包过.
乌当区15837605245: Android签名有什么作用 - ?
敛旭甲硝: 最简单直接的回答: 系统要求的. Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的! Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序. 这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的.
乌当区15837605245: Android签到功能怎么实现的,急求,详细,写论文用 - ?
敛旭甲硝: 点击签到,如果当天已经签过到了,提示已经签过到了;如果从来没有签过到,插入数据,把积分设置为1,连续签到次数设置为1,最后修改时间设置为当天,历史为1;如果今天没有签过到,首先计算出有多少天没签到了,如果是昨天签了的,连续签到次数加1,历史左移一位,积分按照积分规则加上;如果超过两天没有签到,连续签到次数设置为1,历史左移天数位,积分加上签到单次的积分 ,时间为当前的修改时间;或者是这样:建一个签到数据表,两列,一列日期,一列用户外键.点击签到触发controller,存入签到表.为了方便记录连续签到情况,可以建 一个计数表,一列用户外键,一列签到计数,连续签到时加1,断签了就归1.
乌当区15837605245: 如何通过eclipse 查看apk的签名 - ?
敛旭甲硝: 给apk文件签名主要分三步:1、创建证书2、签名3、优化(可选)1)使用jdk的keytool工具生成签名用的证书> keytool -genkey -v -alias CERT -keyalg RSA -keysize 2048 -validity 10000 -keystoreCERT.keystore 创建过程需要输入一些标识信息和...
乌当区15837605245: android studio怎么看应用是否签名 - ?
敛旭甲硝: 我们在使用Android Studio进行应用的发布时要进行签名,本经验将通过我的一个应用的签名过程教大家如何签名.工具/原料 Android Studio 一个自己以前使用的key当然没有可以自己生成一个 方法/步骤 第一步我们打开我们下载安装好的Android Studio 然后我们选择好了我们的要发布的项目选择Build 然后选择Generate Signed APK 然后可以选择创建或者选择一个已有的key,我这里选择以前创建好的一个key文件 然后输入密码等信息,点击next 然后点击finish,选择release版本 我们就可以看到生成的apk文件了,然后我们就可以把应用发布到各平台供人下载了