iOS的签名机制

前言

     了解iOS的签名机制之前我们需要掌握以下几个知识:

  • 加密算法(对称加密, 非对称加密)

  • 单向散列函数

  • 数字签名

  • 证书


 一、加密算法

1、对称加密

对称加密就是: 加密和解密用的密钥是同一个, 常用的加密算法有 :DES 、 3DES 、AES (注:DES 3DES 已不再安全)

  • 优点: 加密、解密速度快
  • 缺点: 不安全, 存在密钥配送问题

假设,A 将使用对称密码加密过的消息发给了B,只有将密钥发送给B,B才能完成解密,在发送密钥过程中,可能会被中间人窃取密钥,最后中间人也能完成解密。

2非对称加密(RSA算法)

非对称加密: 有一对密钥, 成对生成, 分为公钥和私钥. 通过公钥加密的数据, 通过私钥才可以解开.通过私钥加密的数据, 通过公钥才可以解开.

  • 缺点: 加密解密耗时, 速度慢
  • 优点: 安全, 对信息保密,防止中间人截获

假设,A想发送消息给B, B只需要生成一对公钥和私钥, 私钥自己保留, 公钥是公开的,A只需要拿到B的公钥对消息进行加密, 发送给B即可, 所以传输过程中无法被中间人截获解密

3混合密码系统

由于对称和非对称加密都存在各自的缺点, 混合密码系统应运而生

  • 加密解密用: 对称加密 速度快
  • 秘钥配送用: 非对称加密 安全

假设,A想发送消息给B, A生成一个用于对称加密的 密钥 , B用 RSA算法 生成一对公钥和私钥, 私钥自己保留, 公钥是公开的, A首先要用B的公钥对自己生成的秘钥进行加密发送给B, B就拿到了 密钥 , 之后A发消息都用此 密钥 对消息进行加密,B用拿到的 对称密钥 解密即可

总结: 密钥传输用 非对称加密(安全), 消息传输用 对称加密 (速度快)

扫描二维码关注公众号,回复: 16334554 查看本文章

二、单向散列函数(又称摘要)

单向散列函数

是指对不同的输入值,通过单向散列函数进行计算,得到固定长度的输出值。这个输入值称为消息 message,输出值称为散列值 hash value

单向散列函数的特点:

1、根据任意长度的信息计算固定长度的散列值
2、快速计算散列值
3、信息不同计算出的散列值不同
4、具备单向性(也就是通过散列值不能反算出消息来)

常见的单向散列函数有:

MD4,MD5 为128bit (不安全了)
SHA-1 为160bit(20字节)(不安全了)
SHA-2 (SHA-256,SHA-384,SHA-512)
SHA-3 全新标准


 三、数字签名

数字签名主要是为了验证数据没有被篡改过.

为了更好的理解, 我们模拟一遍, 数字签名的实现

  • A要向B发送消息时, A-→B, 如果有中间人把消息改改, AB都不会察觉到, 这时就用到了数字签名.
  • 但是怎么做呢, 肯定需要对比消息是否一致,为了安全只能用非对称加密

1、A生成一对 公钥和私钥, 私钥 自己保留 公钥 发送给B
2、A用私钥对 消息 进行加密生成 签名 ,把[ 消息,签名 ]一起发送给B
3、B收到[ 消息, 签名 ],用 公钥 对 签名 进行解密和收到的 消息 进行对比,来确认数据没有被篡改

以上过程存一个问题:

  • 签名速度太慢: 消息由于通过非对称加密生成的签名, 有时候消息很大, 速度很慢, 这里就用到了单向散列函数

我们可以对 签名的生成 进行改进

1. A生成一对 公钥和私钥 , 私钥 自己保留 公钥 发送给B
2. A首先对消息用单向散列函数生成一个散列值,用私钥对 散列值 进行加密生成 签名 ,把[ 消息, 签名 ]一起发送给B
3. B收到[ 消息, 签名 ], 用 公钥 对 签名 进行解密得到 散列值1 ,同时用相同的单向散列函数对消息生成 散列值2 ,通过两个散列值的对比,来确认数据没有被篡改


 四、证书(Certificate)


证书 也叫 公钥证书 ,主要是为了解决配送发送问题.主要由认证机构 (Certificate Authority) 施加数字签名.
CA 就是能够认定 公钥确实属于此人 并能够用生成数字签名的组织或者个人.

流程大概如下:

  •  A生成一对`公钥和私钥`,A在认证机构CA注册自己的公钥,认证机构用自己的私钥对A的公钥进行数字签名,`[A的公钥,数字签名]`既为证书.
  •  B去认证机构下载A注册的公钥证书`[A的公钥,数字签名]`,B使用认证机构的公钥验证证书的签名,验证成功说明A的公钥的确是A生成的,这样就得到了A的公钥.


五、iOS签名机制

1、certSigningRequest文件

我们创建证书时,苹果会让我们提供一个. certSigningRequest 文件,其实这个文件就包含我们Mac电脑的公钥如下图:


上面文件创建步骤如下图,这个操作就是在我们电脑生成一对 公钥和私钥 ,私钥保存在我们的电脑,公钥生成 . certSigningRequest  文件.

 . certSigningRequest  文件记录了开发者的个人信息、公钥、加密算法以及 单向散列函数等内容

可以使用以下命令来查看文件内容:

1

openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest

内容如下:

2、 .cer  和 .p12 文件

苹果得到我们的Mac公钥之后, 用苹果的私钥对我们的公钥进行签名, 生成开发或者发布证书

                              

.cer文件内容包含开发者账号信息、Mac公钥以及相应的签名

我们可以使用以下命令来查看文件内容:

1

openssl x509 -inform der -in ios_development.cer -noout -text

.p12文件(我们通过钥匙串导出的文件) p12文件 = `.cer文件` + `Mac私钥`

这就是为什么只有生成 `.certSigningRequest`文件的电脑可以打包, 如果其他电脑想打包的话, 必须由生成 `.certSigningRequest`文件的电脑导出p12文件方式来添加证书才可以

3、.mobileprovision 文件(描述文件)

                     


苹果会对(开发, 发布, 推送等)证书进行二次签名, [Mac公钥, 签名] +[devices appid, entitlements],用苹果的私钥进行签名生成一个文件, .mobileprovision 也就是我们平时所说的描述文件.

Entitlements决定了哪些系统资源在什么情况下允许被使用。简单的说他就是一个沙盒的配置列表(plist 文件格式)

 为什么需要 .mobileprovision 文件 

仅有数字证书是不够的,为了防止权限被滥用,开发者还需要在苹果官网上注册用于开发的设备,仅有注册后的设备才被允许按照以上流程安装 app,官方限制最多100台. 除此之外,苹果还需要对 app 的权限进行控制,例如是否能够使用 iCloud、Wallet、Maps 等,苹果将这些功能授权统称为 Entitlements。开发者将上述权限配置完成后,需要从苹果后台下载并安装相应的 mobileprovision 文件

该文件包含:

证书、已注册的设备列表、AppId、功能授权列表、苹果的签名


如果有需要的话,你可以使用以下命令来查看.mobileprovision 文件内容

1

security cms --i RdBossZP.mobileprovision

4、打包及安装流程

1、.mobileprovision 文件会放到Xcode指定目录下面, 当我们打包时, 首先编译生成 二进制数据包 ,然后用Mac私钥对其加密生成签名, 加上.mobileprovision文件生成我们的ipa包.

2、我们每个人的iPhone手机都内置了 苹果的公钥, 当App安装时,首先用苹果的公钥对 .mobileprovision文件 进行两次认证,得到 Mac的公钥 , 最后用Mac公钥验证第三个签名, 如果成功则安装程序.


 六、流程图


1、非Appstroe下载 安装流程

2、Appstroe下载 安装流程
 

两种ipa安装包(.ipa和.zip互转)

  • 我们通过Xcode Archive生成(常见的企业包)
  • 在Appstroe下载

区别: 我们自己生成的ipa里面比在Appstroe下载的多一个 .mobileprovision文件
原因: App提交Appstroe审核后,苹果会对我们的App重签名, 这次是用苹果的私钥对App进行重签名生成[ App,签名 ]

最后

笔者对其认识尚浅,且本文带有一些个人思考,难免纰漏之处,敬请指正。

猜你喜欢

转载自blog.csdn.net/ZhaiAlan/article/details/127854629