http协议封装的数据包->tcp/ip->服务器 缺点:数据包中途被窃取或者被篡改。算法
http协议封装的数据包->ssl加密->tcp/ip->服务器:缺点:虽然安全,可是开销变大,传输数据变慢。浏览器
http的链接很简单,是无状态的;https协议是由ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。缓存
https在传输的过程当中涉及三个密钥:安全
服务器端用的公钥和私钥(公钥加密,私钥解密),用来进行非对称加密。服务器
客户端产生的随机密钥,用来进行对称加密。网络
分为8步:并发
1.客户端向服务器发起HTTPS请求,链接到服务器的443端口。tcp
2.服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥能够发送给任何人。函数
3.服务器将数字证书(公钥,域名)发送给客户端。post
4.客户端对服务端发来的公钥进行检查,验证其合法性,若是发现公钥有问题,https传输就没法继续。而后会生成一个随机值(采用伪随机数生成器生成对称密码的私钥),这个随机值就是客户端密钥,而后用服务器公钥对客户端密钥进行非对称加密,这个客户端密钥就是密文,第一次https请求就结束了。
5.服务端接收到收到客户端的密文,而后用私钥进行非对称解密,解密以后的明文就是客户端密钥,而后用客户端密钥对数据进行加密,这样数据就变成了密文。
6.服务端数据加密后的密文发给客户端。
7.客户端收到服务器发来的密文,用客户端的密钥来进行对称解密,获得服务器端发来的数据,这样第二次http请求就结束了。
数字签名和消息认证码都不是为了加密
能够将单向散列函数获取散列值的过程理解为使用 md5 摘要算法获取摘要的过程
使用本身的私钥对本身所承认的消息生成一个该消息专属的签名,这就是数字签名,代表我认可该消息来自本身
注意:私钥用于加签,公钥用于解签,每一个人均可以解签,查看消息的归属人
证书:全称公钥证书(Public-Key Certificate, PKC),里面保存着归属者的基本信息,以及证书过时时间、归属者的公钥,并由认证机构(Certification Authority, CA)施加数字签名,代表,某个认证机构认定该公钥的确属于此人(防止你随便去拿一个公钥就来进行通讯)
服务器B发送给客户端A的用户证书, 是服务器B向CA机构(数字证书认证机构)申请而来的证书。
1.服务器B返回的数字证书, 客户端A会进行以下验证:
2.握手过程当中涉及到两种证书。
http1.0:无状态、无链接。
http1.1:持久链接,默认Connection:keep-alive,增长了host字段,增长了缓存处理:cache-control,根据客户端请求的前后顺序来返回相应的结果,以保证客户端可以区分每次请求的响应内容。
http2.0:
1.引入二进制和流的概念,帧对数据进行顺序标识,浏览器接收到数据之后根据序列对数据进行合并,不会出现数据错乱的状况。所以有了序列,服务器能够并行的传输数据。
2.多路复用:
一、全部的HTTP2.0通讯都在一个TCP链接上完成,这个链接能够承载任意数量的双向数据流。
二、每一个数据流以消息的形式发送,而消息由一或多个帧组成。这些帧能够乱序发送,而后再根据每一个帧头部的流标识符(stream id)从新组装。
举个例子,每一个请求是一个数据流,数据流以消息的方式发送,而消息又分为多个帧,帧头部记录着stream id用来标识所属的数据流,不一样属的帧能够在链接中随机混杂在一块儿。接收方能够根据stream id将帧再归属到各自不一样的请求当中去。
三、另外,多路复用(链接共享)可能会致使关键请求被阻塞。HTTP2.0里每一个数据流均可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回给客户端,数据流还能够依赖其余的子数据流。
四、可见,HTTP2.0实现了真正的并行传输,它可以在一个TCP上进行任意数量HTTP请求。而这个强大的功能则是基于“二进制分帧”的特性。
3.头部压缩
在HTTP1.x中,头部元数据都是以纯文本的形式发送的,一般会给每一个请求增长500~800字节的负荷。
HTTP2.0使用encoder来减小须要传输的header大小,通信双方各自cache一份header fields表,既避免了重复header的传输,又减少了须要传输的大小。高效的压缩算法能够很大的压缩header,减小发送包的数量从而下降延迟。
4.服务器推送:
服务器除了对最初请求的响应外,服务器还能够额外的向客户端推送资源,而无需客户端明确的请求。
基本:
1.get是从服务器上获取数据,post是向服务器传送数据。
2. POST比GET安全,由于数据在地址栏上不可见。
3.get方式提交的数据最多只能有1024字节,而post则没有此限制。
4.GET使用URL或Cookie传参。而POST将数据放在BODY中。
深刻:
1.GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
2.缓存回退:GET在浏览器回退时是无害的,而POST会再次提交请求,由于,Get请求浏览器有缓存,回退时读取的是缓存中的数据. 可是Post没有浏览器缓存会再次发送请求,消耗服务器性能。
SSL(Secure Sockect Layer 安全套接字协议)的过程就是上面的那个,它所提供的服务:认证用户和服务器,确保数据发送到正确的客户机和服务器;加密数据以防止数据中途被窃取;维护数据的完整性,确保数据在传输过程当中不被改变。
TLS(Transport Layer Security 安全传输层协议)它在会话层
TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS 在SSL v3.0 的基础上,主要有如下加强内容:
1)TLS 使用“消息认证代码的密钥散列法”(HMAC)更安全的MAC算法。
2)TLS提供更多的特定和附加警报,还对什么时候应该发送某些警报进行记录。
3)加强的伪随机功能,TLS对于安全性的改进。
攻击者可利用 SSL 3.0 漏洞获取安全链接当中某些是SSL3.0加密后的明文内容。由于兼容性问题,当浏览器进行 HTTPS 链接失败的时候,将会尝试使用旧的协议版本,因而,加密协议由更加安全的协议,好比 TLS 1.2降级成 SSL 3.0。
若是服务器提供有漏洞的 SSL 3.0 协议的支持,同时,攻击者又能做为中间人控制被攻击者的浏览器发起漏洞版本的 HTTPS 请求,那虽然攻击者监听到的也是加密过的数据,但由于加密协议有漏洞,能够解密这些数据。攻击者能够利用此漏洞,截获用户的隐私数据,好比 Cookie,这样攻击者就能够拿到这些隐私数据,进行更深层次的攻击,进而形成了用户隐私的泄漏。
解决:
惟一解决问题的方法是禁用 SSL 3.0 加密协议,防止TLS 1.2 或者 TLS 1.1 或者 TLS 1.0降级到 SSL 3.0 加密协议。
参考:http://www.javashuo.com/article/p-pmkibrtb-ds.html
(1)远程主机收到用户的登陆请求,把本身的公钥发给用户。
(2)用户使用这个公钥,将登陆密码加密后,发送回来。
(3)远程主机用本身的私钥,解密登陆密码,若是密码正确,就赞成用户登陆。
会发生中间人攻击,截获登陆请求,伪造服务器,从而获取密码。
因此咱们在首次登陆的时候须要咱们肯定”公钥指纹”指纹是否是相同的。