iOS签名机制『理解指南』

Xcode7之前进行真机调试需要进行以下繁琐步骤:
1.生成CertificateSigningRequest.certSigningRequest文件
2.获得ios_development.cer\ios_distribution.cer证书文件
3.注册device、添加App ID
4.获得*.mobileprovision文件
注意:Xcode7以后也是需要这些繁琐步骤的,只是如果你勾选了[Automatically manage signing],Xcode会自动帮你完成以上的步骤而已。

  • 具体操作参考以下链接:
    https://www.jianshu.com/p/be0267ebd238

为什么需要这么繁琐的步骤?

为了安全!
如何保障安全? --通过应用代码签名机制和沙盒机制

iOS签名机制『理解指南』_第1张图片

应用代码签名(App code signing)

iOS签名机制『理解指南』_第2张图片
iOS签名机制『理解指南』_第3张图片

『iOS 内核启动后, 它将控制哪些用户进程和应用可以运行。 为确保所有应用均来自批准的
已知来源并且未被篡改, iOS 要求所有可执行代码均使用Apple颁发的证书进行签名
设备附带的应用(如 “邮件” 和 Safari 浏览器)由Apple签名。 第三方应用也必须使用
Apple颁发的证书进行验证和签名。 强制性代码签名将信任链的概念从操作系统扩展至
应用, 防止了第三方应用加载未签名的代码资源,或使用自修改代码。
······
与其他移动平台不同, iOS 不允许用户安装来自网站的潜在恶意未签名应用或者运行不受信任的代码。运行时,会在加载所有可执行内存页时对这些内存页进行代码签名检查,以确保应用自安装或上次更新之后未被修改过。』
—— 引用自《iOS_Security_Guide》第18页

  • 我们可以从上文中提取到三个概念:① 确保代码未被篡改(注意这里不是防篡改)、② 签名、③ 证书

    • 如何确保代码未被篡改?

      散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。——引用自《维基百科》

      • 理解:通过单向散列函数(One-way hash function),可以算出原始数据唯一的摘要(也可以理解为指纹),这个摘要(散列值)是跟原始数据是相对应的,如果数据有任何微小改动,算出来的摘要值都是不相同的。这样到你拿到数据后,再算一遍散列值,通过对比原始数据的散列值,就可以校验出数据的完整性以及是否被篡改过。常用的单向散列函数算法有MD5,SHA-1,SHA-2。
    • 什么是签名?

      数字签名(又称公钥数字签名,英语:Digital Signature)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。 ——引用自《维基百科》

      • 理解:消息发送者利用公钥密码算法中的私钥对代码的摘要生成签名,意思就是对这段摘要认可,消息接收者利用公钥对签名进行验证,解密出来消息的摘要(散列值)如果对等的话就证明这个消息是没有被篡改过。
      • 注意:数字签名的作用仅仅是为了识别内容有没有被篡改过,而不是为了保证机密性。
    • 什么是证书?

      公开密钥认证(英语:Public key certificate),又称公开密钥证书、公钥证书、数字证书(digital certificate)、数字认证、身份证书(identity certificate)、电子证书或安全证书,是用于公开密钥基础建设的电子文件,用来证明公开密钥拥有者的身份。 ——引用自《维基百科》
      - 理解:因为数字签名有个无法解决的问题“中间人攻击”,证书就是为了解决这个问题。

iOS APP签名流程

  • iOS APP的签名其实分为两种,一种是真机调试,另一种是上传到App Store。这里较为复杂的是真机调试,采用的是双层签名。

    • 从AppStore下载的应用签名验证流程(下图引用自http://blog.cnbang.net/tech/3386/)

      iOS签名机制『理解指南』_第4张图片

      • 步骤简介:
        • 1.每台iOS设备保存公钥,Apple后台保存私钥;
        • 2.APP上传至AppStore,苹果利用后台的私钥对APP源文件的摘要(散列值)进行签名;
        • 3.iOS设备从AppStore下载应用,每次启动的时候进行代码签名检查。
    • 真机调试的签名认证流程(下图引用自http://blog.cnbang.net/tech/3386/)

      iOS签名机制『理解指南』_第5张图片

      • 前提条件:
        • 真机调试不需要把APP源文件上传至Apple后台,但也希望通过Apple的验证才能装到设备上
      • 步骤简介:
        • 1.MacBook生成了一把公钥和私钥;
        • 2.写好的APP源文件通过MacBook的私钥进行签名;
        • 3.通过CA(这里的CA就是苹果)对MacBook的公钥进行签名认证 => 生成签名证书;
        • 4.再配置好appID、devicesID、entitlements(各种权限);
        • 5.签名证书与配置打包,苹果再使用私钥进行一次签名,生成.mobileprovision文件;
        • 6.打包出来的ipa包就包含了以上文件(Mach-O、mobileprovision、资源文件);
        • 7.验证流程就反推回去

参考拓展资料

  • http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
  • http://blog.cnbang.net/tech/3386/
  • https://zh.wikipedia.org/wiki/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB
  • https://developer.apple.com/support/code-signing/
  • https://developer.apple.com/library/content/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html

你可能感兴趣的:(iOS签名机制『理解指南』)