- IOS/
iOS签名机制
目录
要了解iOS签名,首先得从加密入手,了解对称加密、非对称加密、公钥密码、单向散列函数等名词,这些名词一抛出,可能你云里雾里了,但是不急,学习是需要过程的,下面对这些名词一一介绍。
在学之前我们先通过简单模型理解为什么要加密?A给B发送消息,那么如果有不法分子就想知道A发给B是什么内容,那么就会产生窃听
对称加密
加密和解密的密钥相同即为对称加密。它的特点是:加密解密快、传输不安全。
非对称加密(公钥加密) 加密和解密的密钥不同即为非对称加密。加密解密较慢,相比对称加密更安全。
公钥密码 公钥密码中包含一对密码:加密密钥、解密密钥(公钥,私钥)。公钥是可公开的密钥。 公钥加密是为了解决密钥配送问题,通过简单模型理解:
B生成密钥对,并把公钥发送给A,A通过 B的公钥加密消息得到密文,然后发送给B ,B得到密文,通过自己的私钥解密密文就得到了消息。 整个过程没有私钥的泄漏,所以数据传输是安全的,但是想一下: B接收到的消息,真的就是A发送的吗?
混合密码系统(Hybrid Cryptosystem) #
同时结合对称加密的快的有点和非对称加密安全的优点的加密方式。 在混合密码系统中,会多出一个会话密钥(session key),它用于加密和解密消息(对称加密),结合上面的例子,B给的公钥,用来加密会话密钥A同时发送,会话密钥加密的消息和公钥加密的会话密钥给B,那么 B则通过私钥解密得到会话密钥,在用会话密钥解密密文得到消息。
单向散列函数 #
单向散列函数,可以根据根据消息内容计算出散列值,散列值的长度和消息的长度无关,无论消息是1bit、10M、100G,单向散列函数都会计算出固定长度的散列值。
特点
根据任意长度的消息,计算出固定长度的散列值 计算速度快,能快速计算出散列值 消息不同,散列值也不同(哪怕只有1bit的区别也会产生完全不同的散列值) 具备单向性(散列值无法还原为原始文件)
如何防止数据被篡改 #
本地模型网络模型 https://www.realvnc.com/en/connect/download/vnc/
数字签名 #
了解了单向散列函数,就可以理解数字签名,就可以解答之前 ‘遗留的问题’ ‘B接收到的消息,真的就是A发送的吗?’。数字签名就是消息发送者(A)通过私钥加密消息的散列值的到的结果。接受者则(B)可以通过,A的公钥解密签名的到散列值,同时计算的到收到的消息的散列值,如果相等,则确认是(A)发送的消息。
要注意的是,数字签名不能保证消息的机密性,它是一种验证手段,可能确保消息的来源和内容的真实性(验证散列值)。
对于主动攻击者,还存在下面的模型的问题:主动攻击者可能伪造公钥,让发送者误以为是接受者的公钥。
那如何验证公钥的合法性?
证书(Certificate) #
公钥证书(Public-key Certificate,PKC),认证机构(Certificate Authority,CA)施加数字签名。通过国际性组织、政府设立的组织、通过提供认证服务来盈利的企业或个人提供认证服务,也就是发送者,和接收者的第三方担保,它可以确保公钥的合法性。
iOS签名机制 #
iOS的签名机制,可以保证安装到用户手机上的APP都是经过Apple官方允许的。 不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
- 生成 CertificateSigningRequest.certSigningRequest 文件
- 获得 ios_development.cer\ios_distribution.cer 证书文件
- 注册device、添加App ID
- 获得*.mobileprovision文件 (描述文件)
通过原理来翻译,则是:
- 获得Mac电脑公钥
- 通过Mac公钥,向Apple申请加密,为公钥(证书)
- 添加设备,账号
- 向Apple申请将设备账号包装并生成新公钥(描述文件)
XCode自动签名已经完成了以上所有步骤。
.certSigningRequest、.cer、.mobileprovision文件究竟里面包含了什么?有何用处