笔记-iOS 签名机制

写这篇文章的开头是因为一个同事问了我一个问题,

他说如果iOS证书过期了,我们debug包就打不开了,那么appstore下载的包会怎么样呢?

关于证书的概念好像只有:从钥匙串生成CSR文件、上传到apple开发者中心、然后下一步、下一步、select...然后直接生成下载,过期了就重新配一下,感觉都知道又好像只知道这样的一个过程,直到翻了翻资料(李明杰底层原理(上)),才把证书、描述文件、签名...这些彻底弄明白了,如果你和我一样,只知道一个配置,那建议还是看一看这篇文章。

来源:底层原理(上)
学习路线
加密解密 -> 单项散列函数 -> 数字签名 -> 证书 -> iOS签名机制


一、关于加密

根据密码的类型分类:对称加密非对称加密

  • 对称加密:加密、解密使用相同的密钥
  • 非对称加密:加密、解密使用不同的密钥(公钥、私钥),也被称为公钥加密
  • 对称加密优缺点
优点:加密、解密速度快

缺点:不能很好地解决密钥配送问题
对称加密
  • 非对称加密特点、优缺点
特点
- 加密密钥:一般是公开的,因此该密钥称为公钥
- 解密密钥:由消息接收者自己保管,不能公开,因此称为私钥
- 公钥、私钥是一一对应的,不能单独生成

优点:能解决密钥配送问题

缺点:加密、解密速度慢

密钥配送
- 由消息的接受者,生成一对公钥、私钥
- 将公钥发给消息的发送者
- 消息的发送者使用公钥加密消息
非对称加密
  • 混合加密
- 将 ‘对称加密’ 和 ‘非对称加密’ 的优势相结合

优点
- 解决了 ‘非对称加密’ 速度慢的问题
- 通过 ‘非对称加密’ 解决了 ‘对称加密’ 的密钥配送问题

说白了就是
- 用 ‘对称加密’ 对传输数据进行加密;
- 用 ‘非对称加密’ 对 ‘对称加密’ 的密钥进行加密。

二、单向散列函数

单向散列函数,又被称为消息摘要函数(message digest function),哈希函数

  • 特点及作用
特点
- 根据任意长度的消息,计算出固定长度的散列值
- 计算速度快
- 消息不同,散列值也不同
- 具备单向性

作用:防止数据被篡改✨✨✨✨✨

说白了,就是不管对多长的内容进行计算,都能得到相同位数的一串数字,例:

MD5 ("123")                            = 202cb962ac59075b964b07152d234b70
MD5 ("123456789012345678901234567890") = a46857f0ecc21f0a06ea434b94d9cf1d

tips:可直接在Mac终端查看,使用该命令。
- md5 -s "xxxx"
  • 常见的几种单向散列函数
MD5、SHA-1、SHA-2、SHA-3等

三、数字签名(注意:这里与数字证书区别对待)

  • 消息发送者产生,别人无法伪造的一段数字串;(用私钥加密消息的散列值,生成的结果)
  • 同时也是对信息的发送者发送信息真实性的一个有效证明
如何能保证这个签名是消息发送者自己签的?
- 用消息发送者的私钥进行签名

如果有人篡改了文件内容或者签名内容,会是什么结果?
- 签名验证失败,证明内容会篡改

数字签名不能保证机密性?
- 数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改


数字签名的作用
- 确认消息的完整性
- 识别消息是否被篡改
- 防止消息发送人否认


数字签名无法解决的问题:中间人攻击,如果遭遇了中间人攻击,那么
- 公钥将是伪造的
- 数字签名将失效
数字签名的过程.png
数字签名的过程改进-I.png
数字签名的过程改进-II
中间人攻击-数字签名无法解决的问题.png

四、证书

利用CA的私钥,对其他人的公钥生成数字签名

作用:解决中间人攻击(避免公钥被拦截)✨✨✨

- 密码学中的证书,全称叫公钥证书(Public-key Certificate,PKC),跟驾驶证类似
- 里面有姓名、邮箱等个人信息,以及此人的公钥✨✨✨
- 并由认证机构(Certificate Authority,CA)施加数字签名✨✨✨

证书主要内容:个人信息、公钥、权威机构的数字签名

用自己的话说:
就是CA用自己的私钥对你的公钥进行认证,其他人用CA的公钥签名的合法性
证书.png
注册与下载.png

五、iOS签名机制

作用:保证安装到手机上的App都是经过Apple官方允许的

苹果充当了CA机构

不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
- 生成CertificateSigningRequest.certSigningRequest文件
- 获得ios_development.cer\ios_distribution.cer证书文件
- 注册device、添加App ID
- 获得*.mobileprovision文件

对于真机调试,现在的Xcode已经自动帮开发者做了以上操作

思考
每一步的作用是什么?
.certSigningRequest、.cer、.mobileprovision文件究竟里面包含了什么?有何用处?
公钥、私钥持有者
签名机制流程图
  • 如果从AppStroe下载的,里面没有mobileprovision文件,只有 I 和 VII
解释
1、Mac设备的公钥
- 从钥匙串生成CSR文件,就是生成公钥的过程

2、生成证书
- 把公钥(CSR文件)上传到Apple后台
- 利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件

3、mobileprovision描述文件生成
- 选择app id
- 选择devices

六、重签名

  • 查看codesign用法
man codesign
  • 重签名步骤
1、准备一个embedded.mobileprovision文件(必须是付费产生的,aphid、device一定要匹配),并放入app中
- 可以通过Xcode自动生成,然后在编译后的App包中找到
- 可以去开发者证书网站下载

2、从embedded.mobileprovision文件中提取出embedded.plist权限文件
- security cms -D -I embedded.mobileprovision > temp.plist
- /usr/libexec/PlistBuddy -x -c 'Print :Entitlement' temp.plist > embedded.plist

3、查看可用的证书(可以看到证书ID)
- security find-identity -v -p codesigning

4、对.app内部的动态库、AppExtension进行签名
- codesign -fs 证书ID xxx.dylib

5、对.app包进行签名
- codesign -fs 证书ID --entitlements entitlements.plist xxx.app
  • 过程
1、当前app的devices中不包含设备b
2、重新生成一个embedded.mobileprovision,包含设备b,
3、用步骤二中的embedded.mobileprovision替换步骤一种的embedded.mobileprovision
1、查看Mac中的可用证书及ID
2、从embedded.mobileprovision文件中提取出plist权限文件
3、转换成embedded.plist权限文件
4、将图3生成的embedded.plist文件与待签名的ipa放到一个文件夹进行签名

5、将文件夹压缩,修改类型为.ipa类型

重签名GUI工具
  • ios-app-signer
  • iReSign

参考文章

  • 小马哥底层原理(上)
  • 密码学的学术 CP:Alice 和 Bob 的前世今生
  • 数字签名是什么?- 阮一峰
  • 一文彻底搞懂加密、数字签名和数字证书!
  • 浅谈对称加密与非对称加密
  • iOS打包签名,你真的懂吗
  • iOS 的 Code Signing 体系

你可能感兴趣的:(笔记-iOS 签名机制)