http协议属于明文传输协议,数据传输过程没有进行加密,通信双方也没有进行任何认证,通信过程非常容易遭遇劫持、监听、篡改。
1、HTTPS和HTTP的区别:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
2、对称加密
加密和解密使用相同密钥的算法。它要求发送方和接收方在安全通信之前,商定一个对称密钥。对称算法的安全性完全依赖于密钥,密钥泄漏就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信至关重要。
对称加密计算量小、加密速度快、加密效率高
3、非对称加密
私钥加密后的密文,只要是公钥,都可以解密,但是公钥加密后的密文,只有私钥可以解密。私钥只有一个人有,而公钥可以发给所有的人。
非对称加解密特别消耗CPU资源,通常用来作对称密钥交换或者CA签名,不适合用来做应用层内容传输的加解密。
4、摘要算法
摘要算法也称为散列 / 散列值。散列就是通过把一个叫做散列算法的单向数学函数应用于数据,将任意长度的一块数据转换为一个定长的、不可逆转的数字,其长度通常在128~256位之间。所产生的散列值的长度应足够长,因此使找到两块具有相同散列值的数据的机会很少。
无法从结果反推出源数据,但可以通过碰撞得到相同的结果(耗时,几率小)。
5、HTTPS通信过程分析
如果Server(以后简称服务器)给Client(以后简称客户端)的消息是密文的,只有服务器和客户端才能读懂,就可以保证数据的保密性。同时,在交换数据之前,验证一下对方的合法身份,就可以保证通信双方的安全。
采用对称秘钥的通信方式效率高,如果服务器对所有的客户端都采用同一个对称秘钥,则相当于没有加密,所以针对每一个客户端都要协商一个不一致的对称秘钥。
服务器把对称密钥告诉客户端,客户端才能利用对称密钥解开密文的内容。但是,服务器如果将这个对称密钥以明文的方式给客户端,还是会被中间人截获,中间人也会知道对称密钥,依然无法保证通信的保密性。但是,如果服务器以密文的方式将对称密钥发给客户端,客户端又如何解开这个密文,得到其中的对称密钥呢?
如何和客户端协商对称秘钥?
5.1、在SSL握手过程中,通过非对称加密进行协商,确认对称加密方式。
在非对称加解密算法里,公钥加密的数据,有且只有唯一的私钥才能够解密,所以服务器只要把公钥发给客户端,客户端就可以用这个公钥来加密进行数据传输的对称密钥。客户端利用公钥将对称密钥发给服务器时,即使中间人截取了信息,也无法解密,因为私钥只部署在服务器,其他任何人都没有私钥,因此,只有服务器才能够解密。
但是如果在通信过程中,在三次握手或者客户端发起HTTP请求过程中,客户端的请求被中间人劫持,那么中间人就可以伪装成“假冒客户端”和服务器通信;中间人又可以伪装成“假冒服务器”和客户端通信。如图所示。
5.2、那么,非对称加密的公钥如何安全的给客户端呢?
在客户端发起SSL请求后,服务端会将数字证书发给客户端,客户端会对证书进行验证(验证这张证书是否是伪造的?也就是公钥是否是伪造的),如果证书不是伪造的,客户端就获取公钥,加密数据,发给服务器。
这样就保证了客户端和服务端双向通信的安全问题。
- 服务端到客户端的通信是安全的(数字证书校验)。
- 客户端到服务端的通信的安全的(只有私钥才能解密)。
https协议中身份认证的部分是由CA数字证书完成的,证书由公钥、证书主体、数字签名等内容组成。
验证证书的过程就是检测这个非对称加密的公钥的合法性。
6、数字证书
数字证书是经证书授权中心,数字签名的,包含公钥拥有者信息以及公钥的文件,是网络通信中标识通信各方身份信息的一系列数据,它提供了一种在 Internet 上验证身份的方式。
数字签名就是对非对称加密和摘要算法的一种应用,能够确保信息在发布后不会被篡改(摘要算法特性),保证数据的完整性和可信性;同时也可以防止数据被他人伪造(非对称加密算法特性);
6.1 数字证书有三个作用:
- 1、身份授权,确保浏览器访问的网站是经过CA验证的可信任的网站。
- 2、分发公钥,每个数字证书都包含了注册者生成的公钥(验证确保是合法的,非伪造的公钥)。在SSL握手时会通过certificate消息传输给客户端。
- 3、验证证书合法性,客户端接收到数字证书后,会对证书合法性进行验证。只有验证通过后的证书,才能够进行后续通信过程。
6.2 申请一个受信任的CA数字证书流程:
- (1)公司(实体)的服务器生成公钥和私钥,以及CA数字证书请求。
- (2)RA(证书注册及审核机构)检查实体的合法性(在注册系统里面是否注册过的正规公司)。
- (3)CA(证书签发机构)签发证书,发送给申请者实体。
- (4)证书更新到repository(负责数字证书及CRL内容存储和分发),实体终端后续从repository更新证书,查询证书状态等。
6.3 数字证书验证
申请者拿到CA的证书并部署在网站服务器端,那浏览器发起握手并接收到证书后,如何确认这个证书就是CA签发的呢?怎样避免第三方伪造这个证书?答案就是数字签名(digital signature)。
1、数字签名的签发:使用哈希函数对签名内容进行安全哈希,生成消息摘要,然后使用CA自己的私钥对消息摘要进行加密。
2、数字签名的校验:使用CA的公钥解密签名,然后使用相同的签名函数对签名证书内容进行签名,并和服务端数字签名里的签名内容进行比较,如果相同就认为校验成功。
校验数字证书主要靠数字签名。
6.4 客户端怎么获取CA的公钥
浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)。因为客户端接收到的证书中会写有颁发机构,客户端就根据这个颁发机构的值在本地找相应的公钥。
6.5 数字证书安全么?
数字签名是个加密的过程,数字签名验证是个解密的过程。那么通过对称加密算法加密其文件,再通过非对称算法加密其对称密钥 , 又通过散列算法证明其发送者身份和其信息的正确性。
即使第三方劫取了数字证书的报文,也没有CA的私钥可以对修改后的报文进行加密(浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥),相当于公钥是固定的,在本地,三方只能修改私钥)。
7、HTTPS通讯模型
-
客户端发起SSL连接,给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
-
服务端确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。
-
客户端确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给服务端。
-
服务端使用自己的私钥,获取客户端发来的随机数(即Premaster secret)。
-
客户端和服务端根据约定的加密方法,使用前面的三个随机数,生成对称秘钥,用来加密接下来的整个对话过程。
总结:
HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法;但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全;然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全;这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。
参考: