iOS app签名机制

iOS app签名机制前言在移动开发中 iOS 系统下的 app 和 andorid 系统下的 app 一个很大的区别是 android 系统下 app 的安装很方便 可以从多个应用商店下载 小米应用商店 华为应用商店 也可以直接下载 apk 的包安装 而在 iOS 系统下 对 app 的安装限制比较严格 非开发的 app 只能从 AppStore 下载 即使是开发人员 拥有开发者帐号 所开发的 app 也不能随意的安装 有最多 100 台设备的限制 还需要

前言

常用的加密方式

目前主流的加密方式有对称密钥加密和非对称密钥加密。

对称密钥加密

维基百科中对对称密钥加密的定义如下:

非对称密钥加密

MD5加密

MD5全称MD5消息摘要算法(MD5 Message-Digest Algorithm)。严格来说,MD5并不是一种加密方式,MD5只是一个哈希算法,对同一个明文生成的密文(哈希值)是统一的。MD5相较于普通加密来说还有一个优点:MD5生成的密文长度很短(16位或者32位字符)。

数字签名

  1. 首先算出原始数据的摘要。这里的算法要保证:如果原始数据有任何变化,则摘要也会发生变化;对同一份原始数据,使用相同的算法,计算出的摘要是相同的。这一步使用的算法通常是MD5消息摘要算法。
  2. 生成一对公钥和私钥,使用非对称加密方式,用私钥对上一步生成的摘要进行加密,加密的结果就是数字签名。
  3. 在返回数据时,将原始数据和数字签名一起返回给请求数据方。
    请求数据方在接收到数据之后,如何确认数据正确以及数据是合法的呢?请求数据方含有公钥,会对数字签名进行验证,过程如下:
  4. 首先用含有的公钥对数字签名进行解密,如果能够解密成功,说明返回的数据是经过数据发送方认证的(否则数据发送方不会对该数据加密)。
  5. 对原始的数据使用MD5算法,生成原始数据的摘要。
  6. 对比第一步和第二步生成的摘要,如果生成的摘要相等,说明原始数据没有被篡改过。
    由此,通过数字签名可以达到确保数据没有被篡改过以及数据是合法的目的。

通过AppStore下载的app签名机制

如果app仅仅只能从AppStore下载安装,那无疑是非常简单的。实际上,除了从AppStore下载安装,开发者还可以通过Xcode打包来安装,打好的包还可以安装在100台设备上,那么这些是如何控制的呢?

通过Xcode将app安装到手机上

在申请成为苹果开发者之后,可以通过Xcode将开发的app安装到手机上,实际上,即使是开发时的app,也需要通过苹果的验证。对于开发时app的安装,苹果使用的是双层验证。先看一些其他的知识。

CertificateSigningRequest文件

生成的CertificateSigningRequest文件里面保存的是公钥,私钥保存在本地Mac 中。

p12文件

双层签名机制

双层签名的流程如下:

  1. 在本地Mac 生成一对公钥、私钥
  2. 苹果生成一对公钥、私钥。其中私钥在苹果后台管理,每台iOS设备中都有公钥。
  3. 将本地Mac生成的公钥(CertificateSigningRequest)上传至开发者后台,在这个过程中,苹果会使用私钥对该公钥进行签名,最后生成一个证书文件。该证书文件中包含公钥L的原始数据,以及签名信息。开发者需要将该证书下载到本地的Mac。
  4. 在开发阶段,将app安装到手机上时,使用本地Mac的私钥(p12文件)对app进行签名,最终打包到手机上的有 App原数据,使用本地私钥对app加密后的签名文件,以及上一步下载的证书文件。
  5. iOS 设备使用公钥A验证证书中的签名,如果验证通过,说明该公钥是经过苹果认证的(也就是证实了开发者身份)。
  6. 之后使用证书中的公钥L 验证App 签名,如果验证通过,说明该app 的安装是合法的。
    这样,通过两次验证,间接验证了app的安装是经过苹果允许的。
    通过上述的双层验证,只是保证了某app的安装是经过苹果允许的,实际上苹果还有更多的限制:

  7. 只有属于开发者开发的app 才被允许安装
  8. 开发者开发的app不能被随便安装,最多只能安装到100台设备上。
    为了达到上述两个目的,上面流程中在使用私钥A对本地公钥加密时,还有一些其他的信息,如AppID,设备列表等。加上额外信息的流程如下:

实际的开发环境中,在将本地的公钥传到开发者中心后,在开发者中心配置设备列表、AppID、以及各种权限控制,之后苹果使用自己的私钥对这些数据进行签名,生成Provisioning Profile文件。开发时,需要将Provisionging Profile文件下载到本地,通过Xcode打包时,会将Provisioning Profile 文件也一起打包进app中。

结语

本文通过引入常见的加密方式,到数字签名,由浅入深介绍了iOS app签名的机制。本文参考了微信阅读的一篇博客加上自己的理解,包括所使用的插图均来自该博客。如果有理解不对的地方,欢迎大家留言交流。

参考文章

https://wereadteam.github.io/2017/03/13/Signature/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221100.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午6:55
下一篇 2026年3月17日 下午6:55


相关推荐

  • 简述面向对象思想_简述面向对象程序设计的特点

    简述面向对象思想_简述面向对象程序设计的特点简述Java中的面向对象(OOP)思想Java是一种面向对象的语言,那么什么是面向对象(ObjectOrientedProgramming)?首先,什么是对象(Object)?Java中有一种

    2022年8月5日
    8
  • 利用SecureCRTPortable远程连接虚拟机

    利用SecureCRTPortable远程连接虚拟机利用SecureCRTPortable远程连接虚拟机1.出现的问题​ 打开SecureCRTP之后,输入正确的ip地址却无法连接到虚拟机。​ 2.解决调试​ 1.通过windows的cmd去ping虚拟机,同样还是ping不通2.查看网络适配器中VMnet8(该网卡是作为虚拟机与本机交互的一个网卡)3.错误原因:网卡中的ip地址与虚拟机中的地址相同,网关与虚拟机不相同​ 更改网卡中的ip地址使得…

    2022年6月14日
    41
  • VS里调试JS

    VS里调试JS在 asp net 开发中 脚本可以提高 bs 程序与客户的交互能力 降低客户端与服务的数据传输 但是大多数 asp net 开发人员还是趋向于避免写客户端脚本或只用脚本完成一些简单的功能 造成这种状况有很多原因 但是脚本程序难以调试是其中的主要原因 下面的操作步骤描述了怎样利用 vs net 中的调试器来调试 javascript 1 首先 要让你的 ie 允许调试脚本 具体步骤如下 nbsp nbsp 打开 i

    2026年3月16日
    2
  • linux中静态库和动态库的区别,Linux下静态库和动态库的区别

    linux中静态库和动态库的区别,Linux下静态库和动态库的区别首先看看静态库和动态库的定义 linux 下的库有两种 静态库和共享库 动态库 二者的不同点在于代码被载入的时刻不同 静态库的代码在编译过程中已经被载入可执行程序 因此体积较大 共享库的代码是在可执行程序运行时才载入内存的 在编译过程中仅简单的引用 因此代码体积较小 不同的应用程序如果调用相同的库 那么在内存里只需要有一份该共享库的实例 下面通过一个实例来说明一下静态库和动态库的区别 构建程序 最简

    2026年3月17日
    2
  • Ps怎么做电商主图?Nano Banana Pro一键生成场景+特写图

    Ps怎么做电商主图?Nano Banana Pro一键生成场景+特写图

    2026年3月13日
    4
  • 数据库设计工具MySQLWorkBench[通俗易懂]

    数据库设计工具MySQLWorkBench[通俗易懂]  该工具为MySQL官方提供地址:http://dev.mysql.com/downloads/workbench/小伙伴们注意按自己的操作系统选择下载版本。·       注意事项:安装后将环境语言配置成简体中文,否则中文乱码工作步骤新建模型后,会进入此页面。 1./2.切换数据库表设计与ER图。3. 创建/管理ER图4. 创建/管理表结构1….

    2022年7月11日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号