学前须知
虚拟人物设计
为了方便咱们学习iOS的签名机制,本文设置了4个虚拟人物,分别是算法
- Alice、Bob:相互通讯
- EVe:窃听者
- Mallory:主动攻击者
消息通讯与窃听
- 可是这种通讯方式很容易被他人窃听,从而被盗取机密信息
- 那么如何防止信息被监听呢?就须要对通讯信息进行加密操做。
- 接收方拿到密文后进行解密获得明文数据
- 经过加密以后,就算有他人窃听通讯数据,也只能获得被加密后的密文数据
加密解密?
如何进行加密解密?
消息发送者使用密钥进行加密数据库
消息接收者使用密钥进行解密安全
密码的类型
根据密钥的使用方式,咱们能够将密码分为两种网络
对称密码
对称密码就是加密和解密使用相同密钥session
经常使用的对称密码算法有三种函数
DES(Data Encryption Standard)
DES是一种将64bit明文加密成64bit密文的对称密码算法,密钥长度是56bit。其实从规格上来讲,密钥的长度实际上是64bit,可是每隔7bit会设置一个用于错误检查的bit,所以密钥的长度实质上是56bit。
因为DES每次只能加密64bit的数据,遇到较大数据时须要对DES加密进行迭代。并且因为DES加密算法已经能够在短期内破解,全部不建议使用。学习
3DES
3DES是将DES重复3次所获得的一种密码算法,也叫作3重DES,此算法目前还被一些银行机构使用,可是处理速度不高,且有安全性问题。大数据
- 3DES加密过程以下,将明文经过加密-解密-加密成密文
- 3DES解密过程以下,将密文经过解密-加密-解密成明文
以上加密解密过程当中,3个密钥都是不一样的,因此又称为DES-EDE3加密
- 若是以上过程的全部密钥都相同,则结果和普通的DES等价,3次加密解密就没有任何意义
- 若是密钥一、密钥3相同,密钥2不一样,则称为DES-EDE2
AES(Advanced Encryption Standard)
AES是用来取代DES称为新标准的一种对称密码算法,AES的密钥长度有12八、19二、256bit三种。设计
密钥配送问题
什么是密钥配送问题?
使用对称密码时,必定会遇到密钥配送问题,具体以下图
假设Alice将使用对称密码加密后的消息发送给Bob,Bob想要查看明文信息,就须要拿到Alice加密的密钥,因此Alice同时要将密钥发送给Bob,在发送密钥的过程当中,可能会被Eve窃听,Eve拿到窃取的密钥和密文,一样能够解析获得明文消息。
怎样解决密钥配送问题?
解决密钥配送问题,有如下几种方式
- 事先共享密钥。也就是Alice和Bob事先私下共享密钥,不能经过网络传输。不过这种方式很是麻烦,不建议使用。
- 密钥分配中心
- Diffie-Hellman密钥交换
- 公钥密码。公钥密码是如今广泛使用的一种方式,也是咱们主要学习的一种方式。
公钥密码(Public-key Cryptography)
公钥密码中,密钥分为加密密钥和解密密钥两种,它们不是同一个密钥,因此公钥密码又被称为非对称密码(Asymmetric Cryptography)
在公钥密码中:
- 加密密钥是公开的,因此该密钥称为公钥(public key)。
- 解密密钥,由消息接收者本身保管,不能公开,所以也称为私钥(private key)。
- 公钥和私钥是一一对应,不能单独生成的,一对公钥和私钥统称为密钥对(key pair)
- 由公钥加密的密文,必须使用该公钥对应的私钥才能解密。
- 由私钥加密的密文,必须使用该私钥对应的公钥才能解密。
公钥密码解决密钥配送问题
上面说到,密钥配送问题能够经过公钥密码来解决,具体解决流程以下:
- 首先,消息接收者生成一对公钥和私钥。
- 将公钥发给消息发送者。
- 消息发送者用公钥对消息进行加密。
- 消息发送者将加密后的密文发送给消息接收者。
- 消息接收者用私钥对密文进行解密,获得明文数据。
RSA
RSA是目前使用最普遍的公钥密码算法。它的名字是由3位开发者Ron Rivest、Adi Shamir、Leonard Adleman的姓氏首字母组成
混合密码系统
对称密码和非对称密码的对比
- 对称密码不能很好的解决密钥配送问题
- 公钥密码加密和解密速度比较慢,由于消息自己多大,加密后的密文就有多大,因此对于大批量的数据,加密解密速度过慢。
- 为了解决密钥配送问题,同时提高加密解密的速度。因而采起了将对称密码和公钥密码相结合的方式,取长补短。如今网络上密码通讯所用到的SSL/TLS都是运用了混合密码系统。
混合密码系统-加密
会话密钥(session key)
- 会话密钥是专门为本次通讯随机生成的临时的密钥,使用伪随机数生成器来生成
- 会话密钥做为对称密码的密钥,用来对消息进行加密,从而提升速度
加密步骤-发送消息
- 第一步,消息发送者须要拿到消息接收者的公钥
- 第二步,生成会话密钥,做为对称密码的密钥,将消息加密成密文
- 第三步,使用消息接收者的公钥,来加密会话密钥
- 第四步,将第二步和第三步生成的加密结果一块儿发送给消息接收者
发送的内容包括
- 用会话密钥加密的消息(使用对称密码加密)
- 用公钥加密的会话密钥(使用公钥密码加密)
混合密码系统-解密
收到==消息发送者==发过来的消息以后,须要进行解密操做,具体步骤以下:
- 第一步,消息接收者用本身的私钥解密出会话密钥
- 第二步,用第一步解密获得的会话密钥解密消息,获得明文数据
混合密码系统-加密解密完整步骤总结
使用Alice做为==消息发送者==,Bob做为消息接收者
发送消息(加密)
- Bob首先生成一对公钥、私钥
- Bob将公钥共享给Alice
- Alice随机生成一个会话密钥(临时密钥)
- Alice用会话密钥加密须要发送的消息(对称密码加密)
- Alice用Bob的公钥加密会话密钥(公钥密码加密、也称为非对称密码加密)
- Alice将四、5步加密获得的结果一块儿发送给Bob
接收消息(解密)
- Bob利用本身的私钥解密会话密钥(公钥密码解密、也称为非对称密码解密)
- Bob使用会话密钥解密发送过来的消息(对称密码解密)
单项散列函数(哈希函数)
单向散列函数能够根据消息内容计算出散列值。而且散列值的长度和消息的长度无关,不管是1bit、10M、100G的消息,单向散列函数都会计算出固定长度的散列值。
单向散列函数的特色
- 根据任意长度的消息,计算出固定长度的散列值。
- 计算速度快,可以快速计算出散列值
- 消息不一样,哪怕就相差1bit数据,散列值也不一样
经常使用的单向散列函数
单向散列函数又称为消息摘要函数、哈希函数。输出的散列值也被称为消息摘要、指纹。
常见的几种单向散列函数以下
MD四、MD5
产生128bit的散列值,MD就是Message Digest的缩写,目前已经不安全
SHA-1
产生160bit的散列值,目前也不安全
SHA-2
SHA-25六、SHA-38四、SHA-512,散列值的长度分别为256bit、384bit、512bit。散列值长度越大,安全性就越高
SHA-3
SHA3(Secure Hash Algorithm-3)是一种做为新标准发布的单向散列函数算法,用来替代在理论上已被找出攻击方法的SHA-1算法。全世界企业和密码学家提交了不少SHA-3的候选方案,通过长达5年的选拔,最终于2012年正式肯定将Keccak算法做为SHA-3标准。
单向散列函数的应用
防止数据被篡改
- 防止文件被篡改,具体的作法是将文件经过单向散列函数获得散列值。将散列值存放到安全的地方。若是一段时间后,文件被篡改,那么拿到最新的文件,经过单向散列函数,获得最新的散列值,同以前的散列值进行对比,就能够肯定文件是否被篡改。
- 软件被篡改。通常为了分散通讯负荷,一些软件公司会将本身的软件放在镜像站点上供用户下载。那么用户如何判断从镜像站点下载的软件是否被恶意篡改呢?通常软件公司会将软件经过散列函数获得的散列值放在官网上,供用户来对比,只要用户下载的软件获得的散列值和官网一致,那么就代表用户下载的软件没有被恶意篡改过。例如软件VNC,可点击VNC官网查看。
口令加密
在App登陆时,通常都须要进行帐号和密码的校验,可是在数据库中,保存的密码通常都是进行SHA-2散列函数以后的散列值而不是明文密码,因此在登陆时须要对用户输入的密码进行散列算法,获得散列值,再同数据库保存的散列值进行比较,从而判断密码是否正确。
而且,因为散列函数的不可逆,就算他人经过不正当手段获取到数据库中存放的密码的散列值,也没法获取到用户的真实密码。这样就大大增长了用户数据的安全性。
数字签名
其实,无论是使用以前的对称加密、非对称加密仍是混合密码系统,都没法验证消息的真实性。也就是说消息的接收者没法判断这条消息是不是消息发送者所发出的。也有多是他人假装成消息发送者发出的消息。那么怎么来验证消息的真实性呢?经过数字签名的方式来验证。
数字签名的两种行为
- 生成签名。主要由消息发送者完成,经过“签名密钥”生成
- 验证签名。由消息接收者完成,经过“验证密钥”验证
那么,如何保证这个签名是消息发送者本身签的呢?答案就是使用消息发送者本身的私钥进行签名。上文中,咱们知道公钥密钥是公开的,全部人都能拿到的,因此在公钥密码中,任何人都能使用公钥进行加密。
而在数字签名中,任何人均可以使用公钥来验证签名。
数字签名和公钥密码的对比
数字签名其实就是将公钥密码反过来使用
数字签名的过程
普通数字签名过程
- 首先,消息发送者生成一对公钥、私钥。
- 消息发送者将公钥发送给消息接收者。
- 消息发送者用本身的私钥对消息进行加密,获得签名信息。
- 消息发送者将消息和签名一块儿发送给消息接收者。
- 消息接收者使用消息发送者的公钥对签名信息进行解密,获得签名中的消息
- 消息接收者将解密获得的消息和直接获得的消息进行对比,若是二者一致,则说明签名验证成功
可是这样的签名过程速度很慢,由于签名信息是经过加密原有的消息得到,若是消息大小是1M,加密后的签名大小也是1M,最后发送给消息接收者的消息就是2M
改进数字签名过程
在以前数字签名的过程上使用单向散列函数进行改进。
- 首先消息发送者使用单向散列函数计算消息的散列值
- 消息发送者使用本身的私钥对第一步获取到的散列值进行加密,生成签名信息
- 消息发送者将签名信息和消息一块儿发送给消息接收者
- 消息接收者使用消息发送者的公钥对签名信息进行解密,获得解密后的散列值
- 消息接收者对消息进行单向散列计算,获得散列值
- 消息接收者将签名中解密获得的散列值和直接进行散列函数获得的散列值进行对比,若是一致则签名验证成功。
完整的签名过程
数字签名的做用
综合以上几点,能够总结出数字签名的做用:
- 确认消息是否完整
- 识别消息内容是否被篡改
- 防止消息发送者否定发送此消息
数字签名的问题
- 首先思考一下,若是有人篡改了文件的内容或者是签名的内容,会致使什么结果?结果就是签名验证失败,证实了文件内容被篡改。
- 再者,数字签名的过程当中,将消息的明文直接发送给了消息接收者,没法保证消息的安全性?数字签名的做用并非为了保证数据的机密性,仅仅是为了可以识别消息内容有没有被篡改。
要想正确的使用数字签名,就必须验证签名的公钥必须属于真正的发送者。由于在消息发送者和消息接收者之间可能会遭遇中间人攻击,具体攻击步骤以下:
- 消息接收者将本身的公钥发送给消息发送者。
- 中间人窃听到了通讯的内容,获取到了消息接收者发出去的公钥。
- 中间人拦截消息接收者的公钥,将本身的公钥发送给了消息发送者
- 消息发送者误觉得是消息接收者发送过来的公钥,使用接收到的公钥对消息进行加密,而后将密文发送给消息接收者。
- 中间人拦截到密文,使用本身的私钥进行解密,获取到明文消息。而后使用以前拦截到的消息接收者的公钥对消息进行加密,将伪造的密文发送给消息接收者。
- 消息接收者接收到密文,用本身的私钥进行解密,最终获得明文消息。
以上的消息传递过程当中,消息发送者和消息接收者没法察觉到中间人的存在,可是消息已经bei被泄漏了。
上面的通讯过程遭遇到了中间人的攻击,会致使
所以,在验证签名以前,首先得验证公钥的合法性。如何验证公钥的合法性呢?就须要经过证书。
证书
看到证书,咱们会联想到驾驶证、毕业证等等,这些证书都是由权威机构认证的。在密码学中的证书,全称叫作公钥证书(Public-key Certificate,PKC)。和驾驶证、学生证相似。
- 证书中有姓名、邮箱等我的信息,以及此人的公钥
- 而且有认证机构(Certificate Authority,CA)施加数字签名
CA就是可以认定“公钥确实属于此人”并可以生成数字签名的我的或者组织
- 有国际性组织、政府设立的组织
- 有经过提供认证服务来盈利的企业
- 我的也能够成立认证机构
证书的使用
证书的使用有如下几个步骤:
- 消息接收者生成本身的密钥对 2.消息接收者在认证机构注册本身的公钥
- 认证机构用本身的私钥对消息接收者的公钥施加数字签名,而且生成证书
- 消息发送者从认证机构那获得带有认证机构数字签名的消息接收者的公钥(证书)
- 消息发送者使用认证机构的公钥验证数字签名,确认消息接收者公钥的合法性。
- 消息发送者使用消息接收者公钥加密消息,而且发送给消息接收者。
- 消息接收者使用本身的私钥解密密文获得最终的消息
增长认证机构认证流程以后,消息发送者和消息接收者之间,就不存在公钥的传递过程,消息发送者从认证机构获取消息接收者的公钥,这样就杜绝了中间人攻击致使公钥伪造的问题
证书的注册和下载流程以下
- 消息接收者到认证机构注册公钥
- 认证机构对消息接收者的公钥进行数字签名,生成证书保存到仓库中
- 消息发送者从认证机构的仓库中下载证书
- 消息发送者使用认证机构的公钥对证书进行验证,获得消息接收者的公钥