App
的安全问题是咱们在开发过程当中每一个人都会遇到的,而因为iOS
平台的封闭性,遭遇到的安全问题相比于Android
来讲要少得多。但除系统安全以外,咱们仍是面临不少的安全问题:好比网络安全,下面就简单的了解一下HTTPS
是怎么处理网络安全问题的。web
下面就来了解一下HTTPS
;😺算法
咱们知道HTTP
自己是不具有加密功能的,因此也没法作到对通讯总体(使用 HTTP
协议通讯的请求和响应的内 容)进行加密。即,HTTP
报文使用明文方式发送。但是不光在HTTP
协议中,在其余未加密的协议中都会存在相似问题:浏览器
1️⃣:通讯过程当中使用的是未加密的明文,内容会被取抓。安全
2️⃣:对于服务器或者客户端来讲,不会验证通讯方的身份,所以有可能遭到中间人的假装。服务器
3️⃣:没法验证所发送报文的完整性和安全性,并且报文的内容也有多是中间人篡改以后发送过来的。网络
为了统一解决上述这些问题,须要在 HTTP
上再加入加密处理和认证等机制。咱们把添加了加密及认证机制 的 HTTP
称为 HTTPS
。HTTPS
开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性。dom
HTTPS
超文本传输安全协议是一种网络安全传输协议。在计算机网络上,HTTPS
经由超文本传输协议HTTP
进行通讯,但利用SSL/TLS
来加密数据包。TLS/SSL
全称安全传输层协议Transport Layer Security
, 是介于TCP
和HTTP
之间的一层安全协议,不影响原有的TCP
协议和HTTP
协议,具备身份验证、信息加密和完整性校验的功能。 网站
HTTP
协议直接放置在
TCP
协议之上,而
HTTPS
则是在
HTTP
和
TCP
中间加上一层加密层
SSL
。从发送端看,这一层负责把
HTTP
的内容加密后送到下层的
TCP
,从接收方看,这一层负责将
TCP
送来的数据解密还原成
HTTP
的内容。因此严格地讲,
HTTPS
并非一个单独的协议,而是对工做在一加密链接
TLS/SSL
上的常规
HTTP
协议的称呼。
HTTP + 加密 + 证书 + 完整性保护 = HTTPS加密
在了解HTTPS
通讯加密过程以前先来了解几个基本概念:计算机网络
密码学中:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。
加密和解密同用一个秘钥的方式称为对称加密
举个小例子🌰:好比我想寄一些贵重的东西给女友,而后我就搞了个保险柜,而后把物品存在保险柜里(💰💰💰),而后我在锁好保险柜以后,把保险柜邮寄出去,而后把保险柜密码告诉女友,但是不当心隔墙有耳👂,有人听到了这个密码,那么完蛋了,个人保险柜有危险了。这里物品就是明文信息,保险柜就是加密后的密文,保险柜密码就是密钥,你看这样是否是不安全?
⚠️⚠️:注意这里有个危险,若是不发送密钥给对方,对方就没法解密,可是若是在发送密钥的过程当中,密钥有可能会被截获,一旦密钥泄漏,密码也就有可能被破解。那么怎么解决这个问题呢?🤔🤔🤔
那就是下面这个非对称加密了!!!👇👇👇
非对称加密使用一对非对称密钥,一个叫私有密钥,另外一个叫公开密钥公有密钥随意发送,任何人均可以得到,私有密钥不让任何人知道。
从上面咱们能够了解到,对称加密解密的速度比较快,适合数据比较长时的使用,可是缺少安全性,非对称加密和解密花费的时间长、速度相对较慢,只适合对少许数据的使用,可是相对安全,任何一种方式都没法知足HTTPS
:因此HTTPS
采起混合加密的方式;
进行到这里会不会以为一切都结束了,HTTPS
安全加密的问题搞定了,其实这里还存在另一个安全隐患😨😨😨:因为公钥是透明公开的,在公钥的传输过程当中,正确的公钥有可能会被中间人攻击而替换掉,则可能形成数据的篡改。那么如何证实收到的公开密钥是本来预想那台服务器发行的密钥呢?🤔🤔🤔
为了解决上述问题,可使用由数字证书认证机构(CA
,Certificate Authority
)和其相关机关颁发的公开密钥证书。 https协议中身份认证的部分是由CA
数字证书完成的,证书由公钥、证书主体、数字签名等内容组成。在客户端发起SSL
请求后,服务端会将数字证书发给客户端,客户端会对证书进行验证(验证这张证书是不是伪造的?也就是公钥是不是伪造的),若是证书不是伪造的,客户端就获取用于对称密钥交换的非对称密钥(获取公钥).
数字证书有三个做用:
1️⃣:身份受权,确保浏览器访问的网站是通过CA
验证的可信任的网站。
2️⃣分发公钥,每一个数字证书都包含了注册者生成的公钥(验证确保是合法的,非伪造的公钥)。在SSL
握手时会经过certificate
消息传输给客户端。
3️⃣:验证证书合法性,客户端接收到数字证书后,会对证书合法性进行验证。只有验证经过后的证书,才可以进行后续通讯过程。
那么怎么就能保证这个公开密钥是一个正确的公钥,而不是由中间人伪造的呢?
下面来看一下CA
证书的申请流程:
web
网站的证书:
GlobalSign Root CA
是指受信任的根证书颁发机构GlobalSign Domain Validation CA - SHA256 - G2
是指受信任的根证书颁发机构下的中级证书颁发机构juejin.in
是指用户的SSL
证书(是在"受信任的根证书颁发机构"下的"中级证书颁发机构"下颁发的证书)这个三级证书是咱们将本身生成的CSR
提交给签名商,他们用中级证书机构的私钥Private
Key
给咱们的签名成证书。而他们的的证书又是经过Root CA
颁发的(即Root CA
经过它的私钥对中级机构提交的CSR
进行了签名)。
通过上面的简单了解,大概已经知道了HTTPS
的一个简单流程,在HTTPS
的实际应用中,使用的就是数字证书这种校验方式。 下面经过一个流程图来了解一下HTTPS
通讯机制:
以上流程图能够总结为一下几个步骤:
1️⃣:客户端发起请求,以明文传输请求信息,包含SSL
版本信息,加密套件候选列表,随机数random_c
,扩展字段等信息。
2️⃣:服务端返回选择使用的协议版本,选择的加密套件,选择的压缩算法、随机数random_s
等,其中随机数用于后续的密钥协商。服务端也会配置并返回对应的证书Certificate
,用于身份验证与密钥交换。而后会发送Server Hello Done
信息用于通知服务端信息发送结束。
3️⃣:客户端对收到的证书进行校验,校验其合法性。
4️⃣:证书验证合法后, 客户端计算产生随机数字Pre-master Key
(预设主密钥),并用服务端证书中的公钥加密,而后发送给服务端。同时客户端会根据已有的三个随机数根据相应的生成协商的通讯密钥(预主密钥+两个随机数经过复杂算法生成真正的传输密钥)。客户端会通知服务端后续的通讯都采用协商的通讯密钥和加密算法进行加密通讯。而后客户端发送Finished
消息用于通知客户端信息发送结束。
5️⃣:服务端利用私钥解密获得预主密钥,也会根据已有的两个随机数使用相应的算法生成通讯密钥,而后会通知客户端后续的通讯都采用协商的通讯密钥和加密算法进行加密通讯。而后发送Finished
消息用于通知服务端信息发送结束。
6️⃣:客户端和服务器数据传输开始使用通讯密钥进行加密通讯。直到客户端发送断开链接的报文。
这里可能会有疑问,既然 HTTPS
那么安全可靠,那什么还会见到有网站使用HTTP
呢,为什么全部的 Web
网站不一直使用 HTTPS
?
由于加密通讯会消耗更多的 CPU
及内存资源。若是每次通讯都 加密解密,会消耗至关多的资源。这对于访问量较大的网站来讲是有必定的压力的。所以,若是是非敏感信息则使用 HTTP
通讯,只有在包含我的信息,密码等敏感数据时,才利用 HTTPS
加密通讯。好比http://www.zhenai.com/
除此以外,想要节约购买证书的开销也是缘由之一。 要进行 HTTPS
通讯,证书是必不可少的。而使用的证书必须向认证机构(CA
)购买。证书价格可能会 根据不一样的认证机构略有不一样。那些购买证书并不合算的服务以及一些我的网站,可能只会选择采用 HTTP
的通讯方式。
HTTPS
就是要使客户端与服务器端的通讯过程获得安全保证。HTTPS
利用非对称加密创建链接,利用对称加密进行数据通讯,数字认证等等,虽然过程很复杂,在保证安全的同时,也提升访问速度。因此为了保证数据的安全,维护网络稳定,仍是要多使用HTTPS
协议。 文中若有错误还请各位大佬指出。
感谢《图解HTTP》一书