iOS开发系列-iOS签名机制
概述
想要了解iOS的签名机制需要有一定密码学有一定的了解。下面依次介绍的数据的加密解密、单向散列函数、数字签名、证书、iOS签名机制。

数据加密解密
在网络通信中想要防止数据被攻击者拦截,我们通常对我们的数据进行加密(通过密钥对发送的消息根据加密算法生成密文),如果传输的信息被拦截,攻击者获取到的是密文。

根据密钥的使用方法,可以将密码分为2中
- 对称密码
- 公钥密码(非对称密码)
对称密码
在对称密码中,加密、解密使用的相同的密钥。常见的对称密码算法DES、3DES、AES。
DES
- DES是一种将64bit明文加密成64bit密文的对称密码算法,密钥长度是56bit
- 由于DES每次只能加密64bit的数据,遇到比较大的数据,需要对DES加密进行迭代(反复)
- 目前已经可以在短时间内被破解,所以不建议使用
3DES
- 3DES,将DES重复3次所得到的一种密码算法,也叫做3重DES。
- 目前还被一些银行等机构使用,但处理速度不高,安全性逐渐暴露出问题
AES
- 取代DES成为新标准的一种对称密码算法
- 目前AES,已经逐步取代DES、3DES,成为首选的对称密码算法
由于对称密钥加密会遇到密钥配送问题。如果发送者在发送密钥的过程中被拦截发送的加密的密文也能被拦截者解密。为了解决对称加密密钥配送问题就出现了新的加密方式-非对称加密。
公钥密码
在公钥密码中
- 加密密钥,一般是公开的,因此该密钥称为公钥(public key)
- 解密密钥,由消息接收者自己保管的,不能公开,因此也称为私钥(private key)
- 公钥和私钥是一 一对应的,是不能单独生成的,一对公钥和密钥统称为密钥对(key pair)
- 由公钥加密的密文,必须使用与该公钥对应的私钥才能解密
- 由私钥加密的密文,必须使用与该私钥对应的公钥才能解密
公钥密码解决对称密码加密遇到的配送问题
- 由消息的接收者,生成一对公钥、私钥
- 将公钥发给消息的发送者
- 消息的发送者使用公钥加密消息
目前使用最广泛的公钥密码算法是RSA。RSA的名字有3位开发者,即Ron Rivest、Adi Shamir、Leonard Adleman的姓氏首字母组成。
公钥密码算法虽然解决了密钥配送问题,但是他们生的算法加密速度比公钥密钥加密较慢,不适合加密信息量加大的数据。为了解决这个问题我们使用-混合密码系统
混合密码系统
混合密码系统利用了公钥密码+对称密码,利用两者的优势的加密方式。
加密步骤
- 首先为本次通信随机生成的临时密钥,作为对称密码的密钥,用于加密消息,提高速度
- 消息发送者要拥有消息接收者的公钥
- 用消息接收者的公钥,加密会话密钥
- 将前2步生成的加密结果,一并发给消息接收者
消息的接受者拿到加密的会话密钥用自己的私钥解密获取到机密的会话密钥,在利用会话密钥使用对称加密方式解密出明文消息。

在非对称加密必须要将消息接受者的公钥发送给消息发送者,如果此时存在中间人攻击。拦截了消息发送者发送给消息接受者的公钥,给的是攻击者的公钥。为了保证消息接受者接收公钥确实是消息发送者的公钥,那么证书就出场了。
证书(Certificate)
密码学中的证书,全称叫公钥证书(Public-key Certificate,PKC),跟驾驶证类似里面有姓名、邮箱等个人信息,以及此人的公钥。并由认证机构(Certificate Authority,CA)施加数字签名。
CA就是能够认定“公钥确实属于此人”并能够生成数字签名的个人或者组织,有国际性组织、政府设立的组织,有通过提供认证服务来盈利的企业,个人也可以成立认证机。

证书的使用流程
- 消息接受者将自己的公钥上传到CA,CA对消息接受者上传的公钥以及消息接受者其它信息用自己的私钥进行数字签名,证书中就包含消息接受者的公钥和数字签名。
- 接受者拿到证书用CA的公钥做校验
整个流程提到了一个专业词-数字签名。那么下面介绍下数字签名。要想更好的了解数字签名,需要先对单向散列函数有个了解。
单向散列函数
单向散列函数,又被称为消息摘要函数(message digest function),哈希函数。输出的散列值,也被称为消息摘要(message digest)、指纹(fingerprint)。
常见的几种单向散列函数
MD4、MD5
- 产生128bit的散列值,MD就是Message Digest的缩写,目前已经不安全
- Mac终端上默认可以使用md5命令
SHA-1
- 产生160bit的散列值,目前已经不安全
SHA-2
- SHA-256、SHA-384、SHA-512,散列值长度分别是256bit、384bit、512bit
SHA-3
- 全新标准
单向散列函数的使用场景
- 防止数据被篡改
- 口令加密
数字签名
数据签名主要是确认消息的完整性、识别消息是否被篡改、防止消息发送人否认。
用消息发送者的私钥进行签名。保证这个签名是消息发送者自己签的。上面我们知道公钥密码中对大数据进行签名效率会比价低,因此我们利用单向散列函数来优化签名过程。
签名流程
- 消息发送者使用单向散列函数对发送的消息进行计算得到消息的哈希值。
- 消息发送者使用自己的私钥加密哈希值得到签名。
- 将上面生成签名发送和消息给消息接受者
- 消息接受者首先用消息送者的公钥解密拿到消息哈希值
- 然后将消息用相同的单向散列函数计算对比哈希值是否相同。

补充
- 如果有人篡改了文件内容或者签名内容,签名验证失败,证明内容会篡改。
数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改。数字签名不能保证机密性。
iOS签名机制
iOS签名机制的作用:保证安装到用户手机上的APP都是经过Apple官方允许的。
不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
-生成CertificateSigningRequest.certSigningRequest文件
- 获得ios_development.cer\ios_distribution.cer证书文件
- 注册device、添加App ID
- 获得*.mobileprovision文件
对于真机调试,现在的Xcode已经自动帮开发者做了以上操作

如果APP是从AppStore下载安装的,你会发现里面是没有mobileprovision文件的。它的验证流程会简单很多,大概如下所示

iOS开发系列-iOS签名机制的更多相关文章
- iOS开发——高级技术&签名机制
签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的 ...
- iOS开发系列--IOS程序开发概览
概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...
- iOS开发系列-iOS适配
概述 发布iPhone X 系统版本为iOS11, 由于刘海屏原因需要对新的机型做适配. iPhone X safeArea iOS11苹果提出safeArea替代iOS7引入 topLayoutGu ...
- iOS开发系列-iOS布局相关
LayoutSubViews 需要在某个View调整子视图的位置时,可以重写. 以下情况会出发LayoutSubViews方法的调用 init初始化不会触发layoutSubviews,但是是用ini ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--并行开发其实很容易
--多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...
- iOS开发系列--让你的应用“动”起来
--iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...
- iOS开发系列--让你的应用“动”起来
--iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...
- IOS开发系列 --- 核心动画
原始地址:http://www.cnblogs.com/kenshincui/p/3972100.html 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...
随机推荐
- Python 让输入的密码不在屏幕上显示
使用getpass模块 #!/usr/bin/env python import getpass username = raw_input("username:") passwor ...
- Python字典列表字段重组形成新的字典
最近遇到这样一个需求,需要将字典列表中的字段进行重组,形成一个新的字典.举个例子吧: l1 = [{"x": 22, "y": 22, "demand ...
- 构建高性能高并发Java系统 .
转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...
- C++之运算符重载(二元)
一.加号+ 1.成员函数重载 2.友元函数重载 二.输出符号<< 三.索引符号 [ ] 四.补充说明 1.<二元运算符重载>课程评论: (一)为什么<<运算符的重载 ...
- topjui.core.js
var defaultConfig = { pageLoadComplete: false, config: { ctx: "", mainPage: false, pkName: ...
- Apache Shiro RememberMe 1.2.4 反序列化漏洞
拉取镜像 docker pull medicean/vulapps:s_shiro_1 启动环境 docker run -d -p 80:8080 medicean/vulapps:s_shiro_1 ...
- Intellij IDEA 撸码最头大的问题。。
想栈长我当初从 Eclipse 转用 IDEA 真是纠结,放弃然后尝试了N次,不过现在已经算是转型成功了,可以完全脱离 Eclipse 撸码了,虽然说我现在真的撸得非常少了.. 说到 IDEA 的痛点 ...
- 面试39 MySQL读写分离
(1)如何实现mysql的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. (2)MySQL主从复制原 ...
- 各版本IE兼容问题,IE6,IE7,IE8,IE9,IE10,IE11
在网站开发和学习中,由于各种兼容性问题,让开发者挺烦恼的,我的学员也经常因为兼容问题来找我取经. 事实上,IE给出了解决方案,谷歌给出了解决方案,国内著名网站百度也将这个解决方案应用于IE的兼容性问题 ...
- JS事件 什么是事件?JavaScript 创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件。
什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击 ...