iOS应用签名原理

1. 应用签名原理

以前操作系统上是不需要签名的,软件下载下来就能用,盗版横行。苹果希望解决这样的问题,保证每一个安装到iOS系统上的软件都是经过苹果验证的。要怎么保证呢?就是通过签名机制。

1.1 非对称加密(RSA)

代码签名是对可执行文件或脚本进行数字签名,用来确认软件在签名后未被修改或损坏的措施。它是基于非对称加密算法实现的。对称加密是通过同一份密钥加密和解密数据,而非对称加密则有两份密钥,分别是公钥和私钥,用公钥加密的数据,要用私钥才能解密,用私钥加密的数据,要用公钥才能解密。

简单说一下常用的非对称加密算法RSA的数学原理:

  1. 选两个质数xy相乘得出一个大整数n,例如 x=31,y=41,n=xy=1271
  2. 1-n间的随便一个质数z,例如 z=13
  3. 经过一系列数学公式,算出一个数字p,满足:
    • 通过nz这两个数据一组数据进行数学运算后,可以通过np去反解运算,反过来也可以。
    • 如果只知道nz,要推导出p,需要知道xy,也就是要需要把n因数分解。

(n,z)两个数据在一起就是公钥,(n,p)两个数据就是私钥,满足用公钥加密,私钥解密,或反过来公钥加密,私钥解密,也满足在只暴露公钥的情况下,要推导出私钥(n,p),需要把大整数n因数分解。目前因数分解只能靠暴力穷举,而n数字越大,越难以用穷举计算出因数xy,也就越安全,当n大到二进制1024位或2048位时,以目前技术要破解几乎不可能,所以非常安全。

注意:生成密文的长度和明文长度无关,但明文长度不能超过密钥长度。

1.2 数字签名

数字签名是非对称密钥加密技术与数字摘要技术的应用。首先我们需要计算代码的摘要,再利用非对称加密进行加密处理。

Mac钥匙串里面可以看到我们私钥长度是2048位=256字节,所以我们的摘要不能长于256字节。

  1. 我们需要一种算法算出数据的摘要,满足:
    • 原始数据若发生任何变化,计算出的摘要值都会发生改变。
    • 计算出的摘要要足够短,不能长于256字节。最常用的算法就是MD5、SHA-1
  2. 生成一对RSA的公钥和私钥,自己拿着私钥公钥可以发布出去。
  3. 第一步计算出摘要后,用私钥对摘要进行加密,得到的加密数据就是原始数据的数字签名。把数据签名原始数据一起发送给用户。
  4. 用户拿到数据签名原始数据后:
    • 同样的摘要算法对原始数据进行计算摘要值
    • 用公钥对数字签名进行解密,得到发送者算出的摘要值,判断两个摘要值是否相等。

注意:若数据被篡改过,这个值会不一样,导致摘要值不等;若摘要值相等,则说明数据没有被串改。

1.3 单向签名

通过上面的介绍,苹果官方生成一对公钥和私钥,自己拿着私钥,所有的iOS设备内置公钥。苹果将我们上传App Store的App进行数字签名。用户从App Store下载App时,同时下发数字签名。iOS设备对下载的App进行摘要值计算,再用设备内置的公钥对数字签名解密得到摘要值。如果摘要值相同,则说明应用是官方认证且没有被篡改的。

如果只能通过App Store进行下载安装,单向数据签名就可以解决问题,但是苹果还提供了多种App安装方式:

  1. Development:开发证书签名后,认证过的设备可以直接安装应用。
  2. In-House:企业证书签名后,企业内部分发安装使用。
  3. AD-Hoc:相当于企业分发的限制版,限制安装设备数量,较少用。

上面的安装方式总结一下:

  1. 开发阶段,安装包不需要上传到App Store就可以直接安装到设备上。
  2. 既需要保证系统的安全性,又必须对安装的App有绝对的控制权:
    • 经过苹果允许才可以安装。
    • 不能被滥用,导致非开发App也能被安装。

苹果这里给出的方案是双层签名

1.4 双向签名

双向签名的过程如下:

  1. 在Mac系统中生成一对公钥和私钥,这里称为公钥M私钥M。(M=Mac)
  2. 苹果自己有固定的一对公钥和私钥,跟之前App Store原理一样,私钥在苹果后台,公钥在每个iOS系统中。这里称为公钥A私钥A。(A=Apple)
  3. 公钥M以及一些开发者的信息,传到苹果后台(这个就是CSR文件),用苹果后台里的私钥A去签名公钥M。 得到一份数据包含了公钥M以及其签名,把这份数据称为证书
  4. 在开发时,编译完一个App后,用本地的私钥M(P12)对这个App进行签名,同时把第三步得到的证书一起打包进App里,安装到手机上。
  5. 安装时,iOS系统进行2次签名验证:
    • 通过系统内置的公钥A解密证书私钥A获取证书摘要,再验证证书是否被篡改。
    • 验证证书后确保了公钥M是苹果认证过的,再用公钥M去验证App的签名
无授权文件的双向签名

有了上面的过程,已经可以保证开发者的认证,和程序的安全性了。 但是,iOS程序一般是通过App Store分发到用户设备的。如果只有上述的过程,那岂不是只要申请了一个证书,就可以安装到所有 iOS设备了?

苹果这里给出的方案是授权文件

1.5 双向签名+授权文件

苹果为了解决应用滥用的问题,又加上了一些限制:

  • 苹果后台注册过的设备才可以安装。
  • 签名只能针对某一个具体的App。
  • 苹果还想控制App里面的iCloud、Push、后台运行、调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件)。将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中,Xcode运行时会打包进入App内。

在开发时,编译完一个 App后,用本地的私钥M对这个App进行签名,同时把从苹果服务器得到的描述文件打包进APP里,文件名为embedded.mobileprovision。App安装到手机上后,系统将完成验证工作。

双向签名+授权文件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356