证书、iOS的签名机制

1,114 阅读5分钟

对称加密

一把钥匙,既负责加密,也负责解密。

AESDES算法。

非对称加密

两把钥匙,公钥L1和私钥L2。L1加密,L2解密,或者L2加密,L1解密。

RSA算法。

摘要

将信息或文件作哈希算法(摘要算法),不可逆

MD5SHA

数字签名

对摘要加密。验证文件是否被篡改。

数字证书

经过证书授权中心生成的文件。

包含公钥、公钥拥有者、CA的数字签名、有效期、授权中心名称、证书序列号等信息。

CA的数字签名:对证书中除了自己以外的内容作摘要,然后用CA的私钥对摘要加密。

CA会公开公钥。

用来验证证书是否被篡改。

场景模拟

A、B、C三个人,文件W

初始场景

B将W发送给A,C是中间人。

升级1--对称加密

B 对 W 进行加密,发送给A

问题:因为只有一把钥匙,C可能截取。C截取文件后,解密,篡改,再加密,发送给A。

升级2--非对称加密

A有一把公钥A1(公开),私钥A2(自己保留)

B 用 A1 对W加密,发送给A。A收到后,用A2解密。

问题:C截取到加密后的W,无法解密。但是可以伪造。自己创建一份W,用A1加密,发送给A。

题外话:在一般开发中,会将对称和非对称结合使用。既然有非对称,为什么还要对称?因为非对称算法的计算量很大,会造成速度慢,耗性能的问题。

升级3--数字签名

A收到C发送的伪造文件,无法确认文件是否被修改。

B有公钥B1和私钥B2,B1给A。

B将W作摘要生成W1,然后用B2对W1加密,生成W2(数字签名)

B用A的公钥A1对W加密,生成W3。

B将W2和W3一起发送给A。

A收到后,用A2对W3解密,生成W。

A用B1解密W2,生成W1。

对W作摘要算法,判断是否与W1相同。如果不同,则说明W被修改。

问题:C也可以有自己的一套公钥和私钥,按照同样的方式发送给A,A此时会认为还是B发送的。

升级4--数字证书

B申请证书,证书中是包含B的信息,发送给A。

A通过证书,判断公钥是否是B证书中的CA数字签名。

C即使可以篡改,但是无法伪造证书中的签名。

题外话:加密是用来保证文件不被窃取,签名则是验证文件是否被篡改。

iOS中的签名机制

保证每一个App都是经过Apple允许的。

Apple Store安装的包

Apple生成公钥私钥,iOS设备中存放公钥,私钥则由Apple保管。

上传ipa包,由Apple审核并用私钥签名,发布到Apple Store。

用户下载ipa包,用公钥进行验证。如果正确,说明这个app是经过Apple验证的。

Xcode安装/inhouse/Ad-hoc

开发包:开发调试。

inhouse:企业包,内部分发,可以直接安装签名后使用app。

ad-hoc:企业包的低级版,限制了安装设备的数量。

有两点需要注意:

  1. 安装包不需要上传到Apple服务器
  2. 保证行为是Apple允许的,并且不被滥用。

==> 采用双重签名机制。

Mac电脑有公钥和私钥,Apple有公钥和私钥。

开发需要真机调试,在keychain的证书中心,创建证书请求文件CertificateSigningRequest(Mac的公钥)。将CSR发送给Apple服务端。Apple用私钥对CSR进行签名,生成证书(内容包含Mac的公钥+Mac公钥的签名),下载到本地。

编译:Mac的私钥对App进行签名。

安装:将证书一起打包到App中。

验证:iOS系统通过内置的Apple公钥,验证证书,确保证书中的Mac公钥,是经过Apple认证的。使用Mac公钥,验证App签名,确保安装行为是经过Apple允许的。

如何防止app被滥用(非开发的app也能被安装)?

  1. 限制设备,只能在Apple后台注册过的设备。
  2. 限制签名,使签名只针对某一个App。

Apple在签名Mac公钥时,不仅签名Mac的公钥,还有其他信息。同样可以用来保证App的内容不被修改。

设备ID、App ID、Entitlements(权限开关,如Push权限、iCloud、后台运行等)都需要经过苹果签名。生成文件Provisioning Profile

Provisioning Profile:证书(Mac的公钥+签名) + 设备ID + App ID + Entitlements。

编译:Mac的私钥对App签名。

安装:将Provisioning Profile签名一起打包到App中,名称为embedded.mobileprovision

验证:iOS系统通过内置公钥,验证embedded.mobileprovision的签名,同时还验证证书的签名。embedded.mobileprovision的签名验证通过后,就可以取出内部数据,作各种验证。

证书中包含了Mac的公钥和签名,其他的Mac电脑也想编译签名App,如何操作?

在keychain中,将Mac的私钥导出,生成文件.p12。

AppStore下载的包中,是没有embedded.mobileprovision这个文件的,不依赖这个文件。应该会重新签名,不依赖本地的私钥。

盗图一张。

好文章iOS App 签名的原理