HTTP VS HTTPS
HTTP
特点:
- 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
- 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
- 基于请求和响应:基本的特性,由客户端发起请求,服务端响应
- 简单快速、灵活
- 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性
转载整理:https://blog.csdn.net/m0_46573836/article/details/108900752
HTTP协议传输数据以明文形式显示
针对无状态的一些解决策略:
场景:逛电商商场用户需要使用的时间比较长,需要对用户一段时间的HTTP通信状态进行保存,比如执行一次登陆操作,在30分钟内所有的请求都不需要再次登陆。
- 通过Cookie/Session技术
- HTTP/1.1持久连接(HTTP keep-alive)方法,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接
中间人攻击原理
SSL劫持攻击:
SSL劫持攻击即SSL证书欺骗攻击,攻击者为了获得HTTPS传输的明文数据,需要先将自己接入到客户端和目标网站之间;在传输过程中伪造服务器的证书,将服务器的公钥替换成自己的公钥,这样,中间人就可以得到明文传输带Key1、Key2和Pre-Master-Key,从而窃取客户端和服务端的通信数据;
但是对于客户端来说,如果中间人伪造了证书,在校验证书过程中会提示证书错误,由用户选择继续操作还是返回,由于大多数用户的安全意识不强,会选择继续操作,此时,中间人就可以获取浏览器和服务器之间的通信数据
SSL剥离攻击:
这种攻击方式也需要将攻击者设置为中间人,之后见HTTPS范文替换为HTTP返回给浏览器,而中间人和服务器之间仍然保持HTTPS服务器。由于HTTP是明文传输的,所以中间人可以获取客户端和服务器传输数据
HTTPS中间人攻击:https://www.jianshu.com/p/fab64714157a
如何避免中间人攻击
出现安全警报界面的很多情况下(您的连接不是私密连接是否继续访问),都是遇到了中间人攻击的现象,需要对安全证书进行及时地监测。而且大名鼎鼎的github网站,也曾遭遇过中间人攻击。
1、客户端不要轻易相信证书:因为这些证书极有可能是中间人。
2、App 可以提前预埋证书在本地:意思是我们本地提前有一些证书,这样其他证书就不能再起作用了。
HTTPS
基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护
通过抓包可以看到数据不是明文传输,而且HTTPS有如下特点:
- 内容加密:采用混合加密技术,中间者无法直接查看明文内容
- 验证身份:通过证书认证客户端访问的是自己的服务器
- 保护数据完整性:防止传输的内容被中间人冒充或者篡改
混合加密:结合非对称加密和对称加密技术。客户端使用对称加密生成密钥对传输数据进行加密,然后使用非对称加密的公钥再对秘钥进行加密,所以网络上传输的数据是被秘钥加密的密文和用公钥加密后的秘密秘钥,因此即使被黑客截取,由于没有私钥,无法获取到加密明文的秘钥,便无法获取到明文数据。
数字摘要:通过单向hash函数对原文进行哈希,将需加密的明文“摘要”成一串固定长度(如128bit)的密文,不同的明文摘要成的密文其结果总是不相同,同样的明文其摘要必定一致,并且即使知道了摘要也不能反推出明文。
数字签名技术:数字签名建立在公钥加密体制基础上,是公钥加密技术的另一类应用。它把公钥加密技术和数字摘要结合起来,形成了实用的数字签名技术。
http和https的区别
- https要ca证书,要钱
- 传输协议不同,https443端口,而http80端口
- http的连接是简单无状态的,https的数据传输时经过证书加密的
对称加密算法
对称加密算法的特点是加密密钥和解密密钥是同一把密钥K,且加解密速度快,典型的对称加密算法有DES、AES等
非对称加密
既然把密钥传输给别人不安全,那我们就要避免这个问题,首先计算机A和计算机B,分别拥有两个东西,叫做公钥和私钥,这两个东西有什么用呢,简单来说这两个东西是配套来使用的,一段文字通过公钥加密后,需要通过私钥解密才能看到,公钥就像锁,而私钥就像钥匙,现在计算机A拥有一把锁和钥匙,计算机B也拥有一把锁和钥匙,需要注意的是这两个东西是配套使用的,也就是只有自己的钥匙能开自己的锁。然后我们需要怎么做呢,原理很简单,计算机A和计算机B把自己的公钥复制一份,发送给对对方,也就是交换公钥,需要加密数据的时候就用对方的公钥解密,然后发送给对方,然后对方就用自己的密钥解密。如下图:
注:梯形为客户端公钥和私钥,长方形为服务器端公钥和私钥
公钥交换过程
简单来讲一下这个过程
- 首先客户端建立一个连接
- 服务器端将自己的公钥还有一个会话的ID发回给客户端,现在客户端得到了服务器端的公钥
- 客户端把自己的公钥(客户端公钥)和会话ID做一个异或运算,得到一个结果,然后把结果用服务器端的公钥加密发给服务器端
- 服务器端拿到那串东西后,用自己的私钥(服务器端私钥)解密得到那个结果,然后再和会话ID做异或运算,这样服务器端也得到了客户端的公钥
SSL简介
SSL和TLS:
SSL (Secure Sockets Layer)安全套接层。是由Netscape公司于1990年开发,用于保障Word Wide Web(WWW)通讯的安全。主要任务是提供私密性,信息完整性和身份认证。1994年改版为SSLv2,1995年改版为SSLv3.
TLS(Transport Layer Security)安全传输层协议)用于在两个通信应用程序之间提供保密性和数据完整性。该标准协议是由IETF于1999年颁布,整体来说TLS非常类似SSLv3,只是对SSLv3做了些增加和修改。
SSL是一个不依赖于平台和运用程序的协议,位于TCP/IP协议与各种应用层协议之间,为数据通信提高安全支持。
SSL协议的三个特性
① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密。
② 鉴别:可选的客户端认证,和强制的服务器端认证。
③ 完整性:传送的消息包括消息完整性检查(使用MAC)。
SSL协议结构
SSL的体系结构中包含两个协议子层,其中底层是SSL记录协议层(SSL Record Protocol Layer);高层是SSL握手协议层(SSL HandShake Protocol Layer)。
SSL协议主要分为两层:
SSL记录协议层的作用是为高层协议提供基本的安全服务。SSL纪录协议针对HTTP协议进行了特别的设计,使得超文本的传输协议HTTP能够在SSL运行。纪录封装各种高层协议,具体实施压缩解压缩、加密解密、计算和校验MAC等与安全有关的操作。
SSL握手协议层包括SSL握手协议(SSL HandShake Protocol)、SSL密码参数修改协议(SSL Change Cipher Spec Protocol)和SSL告警协议(SSL Alert Protocol)。握手层的这些协议用于SSL管理信息的交换,允许应用协议传送数据之间相互验证,协商加密算法和生成密钥等。
SSL握手协议的作用是协调客户和服务器的状态,使双方能够达到状态的同步。
其中最重要的是记录协议和握手协议:
- SSL记录协议:它建立在可靠的传输(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能。
- SSL握手协议:它建立在SSL记录协议之上,用于在实际的数据传输开始之前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL原理
握手协议
握手协议是客户机和服务器用SSL连接通信时使用的第一个子协议,握手协议包括客户机与服务器之间的一系列消息。SSL中最复杂的协议就是握手协议。该协议允许服务器和客户机相互验证,协商加密和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。握手协议是在应用程序的数据传输之前使用的。
记录协议
记录协议在客户机和服务器握手成功后使用,即客户机和服务器鉴别对方和确定安全信息交换使用的算法后,进入SSL记录协议,记录协议向SSL连接提供两个服务:
(1)保密性:使用握手协议定义的秘密密钥实现
(2)完整性:握手协议定义了MAC,用于保证消息完整性
警报协议
客户机和服务器发现错误时,向对方发送一个警报消息。如果是致命错误,则算法立即关闭SSL连接,双方还会先删除相关的会话号,秘密和密钥。每个警报消息共2个字节,第1个字节表示错误类型,如果是警报,则值为1,如果是致命错误,则值为2;第2个字节制定实际错误类型。
总结
SSL中,使用记录协议协商加密和MAC算法以及保密密钥 ,使用握手协议对交换的数据进行加密和签名,使用警报协议定义数据传输过程中,出现问题如何去解决。
SSH协议
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。简单来说ssh是一种加密的用于远程登录的协议。
基于口令的远程登录
利用ssh远程登录,一般有两种方式,一种是需要密码的,一种是不需要输入密码的
需要密码的ssh远程登录
如上图所示,客户端想登录到服务器端怎么办呢
- 先做一个公钥交换,具体过程像上面那样
- 不是需要输入密码吗,那我就先把密码用服务器端的公钥加密一波在发出去给服务器端
- 服务器端得到加密后的密码后用自己的私钥(服务器私钥)解密一波就知道是不是正确了,然后密码正不正确得搞个反馈回去,这个反馈呢服务器端用客户端的公钥加密一波,再发回去给客户端
- 客户端拿到这个加密后的反馈,就直接用自己的私钥(客户端私钥)解密一下就完事
ssh的免密登录
- 首先不必做公钥交换了,在登录请求之前我需要将客户端的公钥发给服务器端
- 现在客户端发起一个登录请求
- 服务器端怎么做呢,先随机生成一串东西,然后用客户端的公钥进行加密,发给客户端
- 客户端拿到这串解密后的东西后用自己的私钥(客户端私钥)解密一下,如无意外,会得到原来的字符串,然后再把这个解密后的字符串发给服务器端
- 服务器端拿到这串字符串后和自己之前生成的字符串比对一下,看是不是一样,一样的话就是自己人了,把登录反馈回去