通过前一篇 Apk签名机制之——JAR签名机制详解 的分析我们知道,JAR签名需要对apk内所有文件进行hash校验,当资源较多时签名验证速度较慢。为了加快验证速度并加强完整性保证,Andorid在70引入一种全文件签名方案V2。下面来看V2方案的具体设计原理。
在了解V2签名结构前,先来了解下 zip(apk)文件的结构 。
zip文件分为3部分:
通过中央目录起始偏移量和size即可定位到中央目录,再遍历中央目录条目,根据本地文件头的起始偏移量即可在数据区中找到相应的压缩数据。
在 Apk签名机制之——JAR签名机制详解 中我们已经知道,JAR签名是在apk文件中添加META-INF目录,即需要修改 数据区 、 中央目录 ,因为添加文件后会导致中央目录大小和偏移量发生变化,还需要修改 中央目录结尾记录 。V2方案为加强数据完整性保证,不在 数据区 和 中央目录 中插入数据,选择在 数据区 和 中央目录 之间 插入一个 APK签名分块 ,从而保证了原始zip(apk)数据的完整性。具体如下所示:
v2 签名块负责保护第 1、3、4 部分的完整性,以及第 2 部分包含的 APK 签名方案 v2分块 中的 signed data 分块的完整性。
APK签名分块包含了4部分:分块长度、ID-VALUE序列、分块长度、固定magic值。其中 APK 签名方案 v2分块 存放在ID为0x7109871a的键值对中。在进行签名校验时,先找到zip 中央目录结尾记录 ,从该记录中找到 中央目录起始偏移量 ,再通过magic值即可确定前方可能是 APK签名分块 ,再通过前后两个分块长度字段,即可确定 APK签名分块 的位置,最后通过ID(0x7109871a)定位 APK 签名方案 v2分块 位置。
APK 签名方案 v2分块 是一个签名序列,说明可以使用多个签名者对同一个APK进行签名。每个签名信息中均包含了三个部分的内容:
前面说了v2 签名块负责保护第 1、3、4 部分的完整性,以及第 2 部分包含的 APK 签名方案 v2分块 中的 signed data 分块的完整性。第1、3、4部分的完整性是通过内容摘要来保护的,这些摘要保存在 signed data 分块中,而 signed data 分块的完整性是通过签名来保证的。下面来看摘要的计算过程:
第 1、3 和 4 部分的摘要采用以下计算方式,类似于两级 Merkle 树 。
因为V2签名机制是在Android 70中引入的,为了使APK可在Android 70以下版本中安装,应先用JAR签名对APK进行签名,再用V2方案进行签名。要注意顺序一定是先JAR签名再V2签名,因为JAR签名需要修改zip 数据区 和 中央目录 的内容,先使用V2签名再JAR签名会破坏V2签名的完整性。
实际上我们在编译APK时并不需要关心这个过程,在Android Plugin for Gradle 22中,gradle默认会同时使用JAR签名和V2方案对APK进行签名,如果想要关闭JAR签名或V2签名,可以在buildgradle中进行配置:
在 Android 70 中,会优先以 v2方案验证 APK,在Android 70以下版本中,系统会忽略 v2 签名,仅验证 v1 签名。Android 70+的校验过程如下:
因为在经过V2签名的APK中同时带有JAR签名,攻击者可能将APK的V2签名删除,使得Android系统只校验JAR签名。为防范此类攻击,V2方案规定:
攻击者还可能试图删除 APK 签名方案 v2 分块 中安全系数较高的签名,从而使系统验证安全系数较低的签名。为防范此类攻击:
通过 Apk签名机制之——JAR签名机制详解 和本篇文章的分析,我们知道了:
JAR签名的劣势
V2签名的优势
现在我们可以解答 Apk签名的基本概念和用法 前言中提出的问题了:
APK签名是为了保证APK的完整性和来源的真实性,分为JAR签名和V2签名两种方案。核心思想均是计算APK内容的hash,再使用签名算法对hash进行签名。校验时通过签名者公钥解密签名,再与校验者计算的APK内容hash进行比对,一致则校验通过。
签名证书的指纹,在申请第三方SDK时,需填入APK包名和证书指纹,SDK开发者后台会根据这两个值生成一个key。第三方SDK在初始化时,会从系统中获取当前APK的包名、签名证书指纹以及key,然后将此指纹上传到其服务器,然后校验包名、签名证书指纹是否与此key绑定,校验通过后才进行授权。
在V2方案出现之前,快速批量打包方案有3类:
在V2方案出现之后,因同时保证了 数据区 、 中央目录 和 中央目录结尾记录 的完整性,故方案2、3均不适用了。那是不是就没有快速批量打包的可能了呢?当然不是,可以从 APK签名分块 中着手。再回过头来看一下 APK签名分块 的结构:
APK签名分块 中有一个ID-VALUE序列, 签名信息( APK 签名方案 v2 分块 )只存储在ID 为 0x7109871a的ID-VALUE中,通过分析签名校验源码可以发现,其它ID-VALUE数据是未被解析的,也就是说除 APK 签名方案 v2 分块 外,其余ID-VALUE是不影响签名校验的。故可以定义一个新的ID-VALUE,将渠道信息写入 APK签名分块 中。因为V2方案只保证了第1、3、4部分和第 2 部分( APK签名分块 )包含的 APK 签名方案 v2分块 中的 signed data 分块的完整性。新写入的ID-VALUE不受保护,所以此方案可行。实际上美团新一代渠道包生成工具 Walle 就是以这个方案实现的。
好了,到这里APK签名机制的全部内部就分析完了,相信大家看完这三篇文章之后,对JAR签名和V2签名机制都有了大致的了解,有兴趣的同学可以阅读签名和校验的源码进一步分析。
问题二:我的世界电脑版的怎么开服? 楼主留下邮箱,我发给你开服器,一定看完教程!
问题三:我的世界电脑版怎么开服务器? 50分 你好, 下载后,进入‘多人游戏’,然后再输入服务器的地址和名称,有些的是需要下载专属的客户端才能连接服务器
问题四:我的世界电脑版怎么开服务器,简单点。 开服这个东西很复杂,如果你对电脑不懂足够你搞个半天。这个教程比较简单jingyanbaidu/#!/article/27fa7326846df646f8271fac
问题五:我的世界怎么开服 开服方式:
1确定JAVA路径,一般是默认路径,不然就需要自己修改:
把“启动服务器bat”改后缀名为“启动服务器txt”,修改为你安装的JAVA路径后,保存,再把后缀名修改回来;
2用纯文本打开serverproperties这个文件;
3把里面的“server-ip=”后面的IP修改为你自己的IP(外网地址或hamachi的IPv4地址);
4点击“启动服务器bat”,开服;
5关服的时候,记得在游戏中输入“/stop”,不然会导致没有保存而回档。
问题六:我的世界怎样才能在电脑上开一个服务器? 01
概要思路:首先的步骤是先内网开服,保证让局域网内的小友可以一起玩,然后想办法通过相关网络辅助,让外网的人也能联机接入。
开服包的使用。必须要开服包,网上找个自己看得顺眼的开服包,解压本地。不要太低版本的开服包,建议17及以上版本包,注意需要与我的世界客户端版本一样的。
>02
开服参数的设定。如果本地电脑配置一般不要弄太多人,默认是20人玩的,一般就可以了。内网地址使用本地固定的地址,如果IP是自动分配的,可以使用自己的计算机名称。
>03
启动开服文件。大多数开服包的执行文件都是cmd或bat文件。双击执行让它跑起来。运行后不要关闭它。
共2图>04
本地测试,我的世界客户端,在多人游戏下,使用刚刚开服地址联机接入,看看是否可以。出现信号表示内网开服成功了。在局域网内的小伙们可以通过开服地址进行一起联机玩。
>05
在开服端,或开服端所在内网,安装并使用nat123,通过它将自己开服地址转换为全世界人都可以联机的外网地址。添加映射,配置映射信息。内网地址,是本地开服地址。内网端口,是配置开服参数的内网端口。
共2图>06
告诉基友们,你映射后的外网地址和外网端口。通过外网地址进行多人游戏联机接入。
注意事项
开服流程:开服包――局域网内开服成功――映射外网――所有人可联机接入
另外,全端口映射方式也是可以联机的,此模式需要联机接入端同时使用访问者,但速度比较快
打住休息会,如有帮助,别忘记给我来个赞支持下哦
问题七:我的世界电脑开服的问题 真是服了这些一键开服器的作者和使用者,这玩意对小白根本没用,开来开去最多就是把服务器文件设置配置好,没端口映射别人还是连不上,对于小白最大的问题不是服务端和服务器设置,是端口映射啊,端口映射要么是花钱购买,要么是打电话联系宽带运营商看看他们能不能给你一个外网ip,不要钱就创建服务器是想多了
为什么你能连上啊,因为你自己创的服务器就在你自己的电脑上你当然能能连上啊
问题八:我的世界pc版怎么开服务器 1下载一个水桶服务器:见底部附件craftbukkit-147-R10jar(官网下载:
)
2在你的电脑新建一个文件夹,名字随便,例如“MCServer”
3将第1步下载的服务器文件放进MCServer文件夹内
4再在MCServer文件夹内新建一个记事本,名字为Starttxt
5打开记事本,把以下代码粘贴去:
title 这里填你的服务器名称
color 服务器bat字体颜色
java -Xms1024M -Xmx1024M -jar 这里填服务器文件jar的文件名
PAUSE
例如:
title myworld
color f
java -Xms1024M -Xmx1024M -jarcraftbukkit-147-R10jar
PAUSE
6保存以上代码到记事本后,将记事本的扩展名txt改为bat,即Startbat
7双击Startbat,d出黑色窗口,等待处理jar(需要一段时间)
8看到黑色窗口出现Done字样,就完成了,然后关闭黑色窗口
9会发现MCServer文件夹生成了很多文件,找到serverproperties,用记事本打开
10修改以下参数:
online-mode=true 改为online-mode=false
gamemode=0 改为gamemode=1(0为生存模式,1为创造模式)
注:online-mode必须修改,否则玩不了,其他参数你看着办吧
11改完后运行Startbat,进入游戏。(Startbat不能关闭,怎么关闭后面讲)
12选择多人游戏 - 添加服务器 - 在服务器地址输入localhost,然后点击完成
13如果看到服务器有信号证明你成功了
14邀请朋友方法:百度一下IP,会看到自己的IP地址,然后复制,发送给朋友
15朋友拿到地址后,进入游戏 - 多人游戏 - 直接连接 - 直接输入刚才的服务器地址
(IP会改变,每次和朋友玩的时候都要重新百度一下复制给朋友。如果希望固定IP的你可以下载一个hamachi网络工具,朋友也要下载,然后你开个群,把朋友拉进来,hamachi显示的IP就是固定的,但使用hamachi偶尔会出现游戏延迟)
16退出游戏时候需要注意,必须在黑色窗口输入stop指令停止服务器,否则刚才玩的记录会全部丢失。如果玩的过程中担心电脑死机或停电导致记录丢失,你偶尔在黑色窗口输入save-all,存档。
以上纯为个人服务器架设经验,如果服务器架设失败,可能各自电脑系统或其它前置软件的造成问题
问题九:电脑把我的世界服务器怎么开 1下载一个水桶服务器:见底部附件craftbukkit-147-R10jar(官网下载:dlbukkit/)
2在你的电脑新建一个文件夹,名字随便,例如“MCServer”
3将第1步下载的服务器文件放进MCServer文件夹内
4再在MCServer文件夹内新建一个记事本,名字为Starttxt
5打开记事本,把以下代码粘贴去:
title 这里填你的服务器名称
color 服务器bat字体颜色
java -Xms1024M -Xmx1024M -jar 这里填服务器文件jar的文件名
PAUSE
例如:
title myworld
color f
java -Xms1024M -Xmx1024M -jarcraftbukkit-147-R10jar
PAUSE
6保存以上代码到记事本后,将记事本的扩展名txt改为bat,即Startbat
7双击Startbat,d出黑色窗口,等待处理jar(需要一段时间)
8看到黑色窗口出现Done字样,就完成了,然后关闭黑色窗口
9会发现MCServer文件夹生成了很多文件,找到serverproperties,用记事本打开
10修改以下参数:
online-mode=true 改为online-mode=false
gamemode=0 改为gamemode=1(0为生存模式,1为创造模式)
注:online-mode必须修改,否则玩不了,其他参数你看着办吧
11改完后运行Startbat,进入游戏。(Startbat不能关闭,怎么关闭后面讲)
12选择多人游戏 - 添加服务器 - 在服务器地址输入localhost,然后点击完成
13如果看到服务器有信号证明你成功了
14邀请朋友方法:百度一下IP,会看到自己的IP地址,然后复制,发送给朋友
15朋友拿到地址后,进入游戏 - 多人游戏 - 直接连接 - 直接输入刚才的服务器地址
(IP会改变,每次和朋友玩的时候都要重新百度一下复制给朋友。如果希望固定IP的你可以下载一个hamachi网络工具,朋友也要下载,然后你开个群,把朋友拉进来,hamachi显示的IP就是固定的,但使用hamachi偶尔会出现游戏延迟)
16退出游戏时候需要注意,必须在黑色窗口输入stop指令停止服务器,否则刚才玩的记录会全部丢失。如果玩的过程中担心电脑死机或停电导致记录丢失,你偶尔在黑色窗口输入save-all,存档。
以上纯为个人服务器架设经验,如果服务器架设失败,可能各自电脑系统或其它前置软件的造成问题是你的JAVA安装路径不对
java目录打开
bat命令行应该有"C:\Program Files\Java\jre6\bin\javaexe" -Xincgc -Xmx1G -jar "%BINDIR%\craftbukkit-123-R01jar"
这行前边那段"C:\Program Files\Java\jre6\bin\javaexe"
把引号内的java改成你自己的java目录
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)