导语
iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,CertificateSigningRequest,p12,AppID,概念一堆,也很容易出错,本文尝试从原理出发,一步步推出为什么会有这么多概念,希望能有助于理解 iOS App 签名的原理和流程。
目的
先来看看苹果的签名机制是为了做什么。在 iOS 出来之前,在主流操作系统(Mac/Windows/Linux)上开发和运行软件是不需要签名的,软件随便从哪里下载都能运行,导致平台对第三方软件难以控制,盗版流行。苹果希望解决这样的问题,在 iOS 平台对第三方 APP 有绝对的控制权,一定要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,怎样保证呢?就是通过签名机制。
非对称加密
通常我们说的签名就是数字签名,它是基于非对称加密算法实现的。对称加密是通过同一份密钥加密和解密数据,而非对称加密则有两份密钥,分别是公钥和私钥,用公钥加密的数据,要用私钥才能解密,用私钥加密的数据,要用公钥才能解密。
简单说一下常用的非对称加密算法 RSA 的数学原理,理解简单的数学原理,就可以理解非对称加密是怎么做到的,为什么会是安全的:
-
选两个质数p和q相乘得出一个大整数n,例如 p=61,q=53,n=pq=3233
-
选 1-n 间的随便一个质数e,例如 e = 17
-
经过一系列数学公式,算出一个数字d,满足:
a. 通过n和e这两个数据一组数据进行数学运算后,可以通过n和d去反解运算,反过来也可以。
b. 如果只知道n和e,要推导出d,需要知道p和q,也就是要需要把 n 因数分解。
上述的(n,e)这两个数据在一起就是公钥,(n,d)这两个数据就是私钥,满足用公钥加密,私钥解密,或反过来公钥加密,私钥解密,也满足在只暴露公钥(只知道n和e)的情况下,要推导出私钥(n,d),需要把大整数n因数分解。目前因数分解只能靠暴力穷举,而n数字越大,越难以用穷举计算出因数p和q,也就越安全,当n大到二进制 1024 位或 2048 位时,以目前技术要破解几乎不可能,所以非常安全。
若对数字d是怎样计算出来的感兴趣,可以搜索这两篇文章:
RSA 算法原理(一)&(二)
数字签名
现在知道了有非对称加密这东西,那数字签名是怎么回事呢?
数字签名的作用是我对某一份数据打个标记,表示我认可了这份数据(签了个名),然后我发送给其他人,其他人可以知道这份数据是经过我认证的,数据没有被篡改过。
有了上述非对称加密算法,就可以实现这个需求:
-
首先用一种算法,算出原始数据的摘要。需满足 a.若原始数据有任何变化,计算出来的摘要值都会变化。 b.摘要要够短。这里最常用的算法是MD5。
-
生成一份非对称加密的公钥和私钥,私钥我自己拿着,公钥公布出去。
-
对一份数据,算出摘要后,用私钥加密这个摘要,得到一份加密后的数据,称为原始数据的签名。把它跟原始数据一起发送给用户。